2

我在尝试创建适用于所有 Traversable 子类(包括 Array)的隐式类时遇到了问题。我在 Scala 2.11.1 和 2.10.4 中都尝试了以下简单示例:

implicit class PrintMe[T](a: Traversable[T]) {
  def printme = for (b <- a) print(b)
}

据我了解,这应该允许隐式转换为 PrintMe,以便可以在任何 Traversable 上调用 printme,包括 List 和 Array。例如:

scala> List(1,2,3).printme
123
// Great, works as I expected!

scala> Array(1,2,3).printme
<console>:23: error: value printme is not a member of Array[Int]
              Array(1,2,3).printme
// Seems like for an Array it doesn't!

scala> new PrintMe(Array(1,2,3)).printme
123
// Yet explicitly building a PrintMe from an Array works 

这里发生了什么?为什么隐式转换适用于 List 而不是 Array?

我知道有一些技巧来适应 java Arrays 但是从http://docs.scala-lang.org/overviews/collections/overview.html看下面的图片,看起来 Array 的行为就像 Traversable 的子类.

scala.collection.immutable

4

1 回答 1

5

正如@goral 所说:一次只能发生一次隐式转换。

因此,您可以传递一个预期 Traversable 的 Array,因为 Array 将成为 WrappedArray:

def printme[T](a: Traversable[T]) { for (b <- a) print(b) }
printme(Vector(1,2,3))
printme(Array(1,2,3))

或者您可以在手动包装的数组上使用您的隐式:

val wa = scala.collection.mutable.WrappedArray.make(Array(1, 2, 3))
wa.printme

但你不能同时拥有两者。

于 2014-08-19T19:58:41.760 回答