如何编写从Array[_]
到List[_]
类型的隐式转换?我尝试了以下但它似乎不起作用。
scala> implicit def arrayToList[A : ClassManifest](a: Array[A]): List[A] = a.toList
<console>:5: error: type mismatch;
found : Array[A]
required: ?{val toList: ?}
Note that implicit conversions are not applicable because they are ambiguous:
both method arrayToList in object $iw of type [A](a: Array[A])(implicit evidence$1: ClassManifest[A])List[A]
and method genericArrayOps in object Predef of type [T](xs: Array[T])scala.collection.mutable.ArrayOps[T]
are possible conversion functions from Array[A] to ?{val toList: ?}
implicit def arrayToList[A : ClassManifest](a: Array[A]): List[A] = a.toList
^
答案 0 :(得分:10)
implicit def arrayToList[A](a: Array[A]) = a.toList
似乎按预期工作。我的猜测是,genericArrayOps
中已有Predef
来自Array[T] -> ArrayOps[T]
的隐式转化签名,ArrayOps[T]
有一个方法.toList(): List[T]
。您的方法具有签名Array[T] -> List[T]
,这也使方法.toList[T]
可用。正文要求使用该签名进行隐式转换。编译器不知道使用arrayToList
会使该方法进入无限循环,因此模糊错误。但是,类型推断返回类型似乎能够解决此问题。看来,对于类型推理,暗示分辨率并不是很好。
另外值得注意的是,由于默认情况下已经存在隐式转换,因此您无需进行从Array
到List
的隐式转换。
答案 1 :(得分:6)
从数组转换时不需要Manifest
或ClassManifest
,因为Array
是一种“集合”类型,可以对其进行特殊处理JVM并没有进行类型擦除。
这意味着您可以采用明显/简单的方法,不需要任何技巧:
implicit def arrayToList[A](arr: Array[A]) = arr.toList
虽然有一个问题......鉴于.toList
已经是如此微不足道的操作,你通过暗示它获得了什么?