我的代码很简单:
class MyClass {
var foo: IndexedSeq[MyClass] = IndexedSeq()
def bar(newValues: MyClass*) = foo = newValues.toArray
}
该类包含变量和方法。变量foo
是IndexSeq
个MyClass
个对象。它还包含一个方法bar
,该方法将Seq
个MyClass
个对象作为参数。因为Seq[T]
无法分配给IndexSeq[T]
,因为后者是前者的子类,所以我不得不拨打toArray
。
使用此代码,编译器会抱怨如下
polymorphic expression cannot be instantiated to expected type;
found : [B >: MyClass]Array[B]
required: IndexedSeq[MyClass]
def bar(newValues: MyClass*) = foo = newValues.toArray
^
所以我找到了一个解决方案,即调用toIndexSeq
而不是toArray
,编译器不再抱怨了。
即使问题已经消失,我仍然想知道为什么会出现这样的错误。
答案 0 :(得分:0)
如果您查看spec for Array
,则会注意到它不会延伸Seq
或IndexedSeq
。实际上,Array
是一个只扩展Serializable
和Cloneable
的简单类,因为它基于Java Array
实现。由于Seq
Array
上Array[B >: MyClass]
提供了隐式转换,您可能会像toArray
一样对待它。
问题是没有从IndexedSeq[MyClass]
(toArray
返回的内容)到Array[MyClass]
的隐式转换。如果您明确提供Seq[MyClass]
的泛型参数或使用类型归属,则此问题已得到解决,因为存在从def bar(newValues: MyClass*) = foo = newValues.toArray[MyClass]
def bar(newValues: MyClass*) = foo = (newValues.toArray : Array[MyClass])
到class Foo
Seq(new Foo).toArray : Seq[Foo] //fails
Seq(new Foo).toArray[Foo] : Seq[Foo] //works!
(Seq(new Foo).toList.toArray : Array[Foo]) : Seq[Foo] //also works!
的隐式转换:
{{1}}
这个更简单的例子可能有助于阐明:
{{1}}