我遇到了一个问题,试图创建一个适用于所有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。 E.g:
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而不是数组?
我知道有一些技巧适应java Arrays,但是从http://docs.scala-lang.org/overviews/collections/overview.html看下面的图片看来,Array似乎就像Traversable的子类一样。
答案 0 :(得分:5)
正如@goral所说:一次只能进行一次隐式转换。
因此,您可以传递一个数组,其中可以使用Traversable,因为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
但你不能同时兼得。