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

Jea*_*let 4 inheritance scala raw-types scala-java-interop

我正在编写一个包装器,它将Scala ObservableBuffer和fires事件与Eclipse/JFace Databinding框架兼容.

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

val list = new java.util.ArrayList[Int]
val obsList = new ObservableList(list, null) {}
Run Code Online (Sandbox Code Playgroud)

有错误:

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]
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*Iry 5

在继承层次结构中具有Java原始类型会导致此类问题.一种解决方案是编写一小部分Java来修复原始类型,就像Java接口中扩展java.util.comparator的Scala类cant覆盖比较方法的答案一样

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