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

当类层次结构中存在原始类型时,Scala为什么抱怨非法继承?,scala,inheritance,scala-java-interop,raw-types,Scala,Inheritance,Scala Java Interop,Raw Types,我正在编写一个采用Scala并触发与框架兼容的事件的包装器 在数据绑定框架中,有一个抽象来修饰普通Java列表。我想重用这个基类,但即使是这个简单的代码也失败了: val list = new java.util.ArrayList[Int] val obsList = new ObservableList(list, null) {} 有错误: illegal inheritance; anonymous class $anon inherits different type instanc

我正在编写一个采用Scala并触发与框架兼容的事件的包装器

在数据绑定框架中,有一个抽象来修饰普通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
。这是预期的行为吗?我如何解决它?

从javadoc看,构造函数的参数没有参数化

我想试试这个:

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

继承层次结构中存在Java原始类型会导致此类问题。一种解决方案是编写少量Java来修复原始类型,如


有关为什么原始类型对scala有问题的更多信息,请参阅此错误。这个bug有一个使用存在类型的解决方法,可能在这种情况下不起作用,至少在没有大量强制转换的情况下不起作用,因为java.util.List type参数同时处于co和contra-variant位置。

我不知道答案,但是当列表由对象而不是原语参数化时,它会起作用吗?(例如,
ArrayList[String]
ArrayList[java.lang.Integer]
?)不,我仍然会遇到同样的错误。我不是Scala方面的专家,但为什么在初始化
可观察列表时使用大括号?这不是某种局部函数吗?在Java中,这可能是继承,但为什么要继承它?
ObservableList
是抽象的,但没有抽象方法。我需要花括号来实例化一个匿名子类。你有指向ObservableList的javadoc的指针吗?我在谷歌上搜索了一下,但发现了各种不同的方法,比如
新参数化类型[\u]
从来都不起作用(Java中的
新事物
);它不能编译。