我正在编写一个包含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
。这是预期的行为,我该如何解决它?
答案 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) {}