当类层次结构中存在原始类型时,为什么Scala会抱怨非法继承?

时间:2011-02-14 11:35:12

标签: scala inheritance scala-java-interop raw-types

我正在编写一个包含Scala ObservableBuffer的包装器,并触发与Eclipse/JFace Databinding框架兼容的事件。

在Databinding框架中,有一个抽象ObservableList来装饰普通的Java列表。我想重用这个基类,但即使这个简单的代码也失败了:

val list = new java.util.ArrayList[Int]
val obsList = new ObservableList(list, null) {}

有错误:

illegal inheritance; anonymous class $anon inherits different type instances of trait Collection: java.util.Collection[E] and java.util.Collection[E]
illegal inheritance; anonymous class $anon inherits different type instances of trait Iterable: java.lang.Iterable[E] and java.lang.Iterable[E]

为什么呢?它与原始类型有关吗? ObservableList实现了IObservableList,它扩展了原始类型java.util.List。这是预期的行为,我该如何解决它?

2 个答案:

答案 0 :(得分:5)

在继承层次结构中使用Java原始类型会导致此类问题。一种解决方案是编写一小部分Java来修复原始类型,如Scala class cant override compare method from Java Interface which extends java.util.comparator的答案

有关scala原始类型有问题的详细信息,请参阅此错误http://lampsvn.epfl.ch/trac/scala/ticket/1737。该bug有一个解决方法,使用存在类型可能不适用于这种特殊情况,至少没有大量的转换,因为java.util.List类型参数在co和contra变体位置。

答案 1 :(得分:-2)

从查看javadoc开始,构造函数的参数未参数化。

我试试这个:

val list = new java.util.ArrayList[_]
val obsList = new ObservableList(list, null) {}