为什么Scala编译器认为存在多态类型错误?

时间:2015-03-19 03:08:36

标签: scala types polymorphism

我的代码很简单:

class MyClass {
  var foo: IndexedSeq[MyClass] = IndexedSeq()
  def bar(newValues: MyClass*) = foo = newValues.toArray
}

该类包含变量和方法。变量fooIndexSeqMyClass个对象。它还包含一个方法bar,该方法将SeqMyClass个对象作为参数。因为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,编译器不再抱怨了。

即使问题已经消失,我仍然想知道为什么会出现这样的错误。

1 个答案:

答案 0 :(得分:0)

如果您查看spec for Array,则会注意到它不会延伸SeqIndexedSeq。实际上,Array是一个只扩展SerializableCloneable的简单类,因为它基于Java Array实现。由于Seq ArrayArray[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}}