在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]
?或者这个问题是否需要对从Array
到IndexedSeq
的隐式转换做些什么?
答案 0 :(得分:4)
问题是.toArray
方法返回某种类型B
的数组,它是T
中List[T]
的超类。如果list.toArray
扩展List[Bar]
,则允许您在Array[Foo]
Bar
上使用Foo
。
是的,这个开箱即用的真正原因是编译器试图弄清楚要使用哪个B
以及如何到达IndexedSeq
。似乎它正在尝试解决IndexedSeq[String]
要求,但B
仅保证是String
或String
的超类;因此错误。
这是我首选的工作:
def fromList(list: List[String]): Foo = new Foo(list.toArray[String])