Scala类型推断:不能从Array [T]推断出IndexedSeq [T]

时间:2014-10-31 15:09:16

标签: arrays scala implicit-conversion type-inference scala-collections

在Scala 2.11.2中,以下最小示例仅在Array[String]上使用类型归属时编译:

object Foo {    

  def fromList(list: List[String]): Foo = new Foo(list.toArray : Array[String])   

}

class Foo(source: IndexedSeq[String])    

如果我删除了fromList中的类型归属,它将无法编译并出现以下错误:

Error:(48, 56) polymorphic expression cannot be instantiated to expected type;
 found   : [B >: String]Array[B]
 required: IndexedSeq[String]
  def fromList(list: List[String]): Foo = new Foo(list.toArray)
                                                       ^

为什么编译器不能在这里推断Array[String]?或者这个问题是否需要对从ArrayIndexedSeq的隐式转换做些什么?

1 个答案:

答案 0 :(得分:4)

问题是.toArray方法返回某种类型B的数组,它是TList[T]的超类。如果list.toArray扩展List[Bar],则允许您在Array[Foo] Bar上使用Foo

是的,这个开箱即用的真正原因是编译器试图弄清楚要使用哪个B以及如何到达IndexedSeq。似乎它正在尝试解决IndexedSeq[String]要求,但B仅保证是StringString的超类;因此错误。

这是我首选的工作:

def fromList(list: List[String]): Foo = new Foo(list.toArray[String])