从数组到列表的隐式转换

时间:2011-02-13 04:30:01

标签: scala implicit-conversion

如何编写从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
                                                                           ^

2 个答案:

答案 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会使该方法进入无限循环,因此模糊错误。但是,类型推断返回类型似乎能够解决此问题。看来,对于类型推理,暗示分辨率并不是很好。

另外值得注意的是,由于默认情况下已经存在隐式转换,因此您无需进行从ArrayList的隐式转换。

答案 1 :(得分:6)

从数组转换时不需要ManifestClassManifest,因为Array是一种“集合”类型,可以对其进行特殊处理JVM并没有进行类型擦除。

这意味着您可以采用明显/简单的方法,不需要任何技巧:

implicit def arrayToList[A](arr: Array[A]) = arr.toList

虽然有一个问题......鉴于.toList已经是如此微不足道的操作,你通过暗示它获得了什么?