4

我正在编写一个包装器,它采用 Scala并触发与Eclipse/JFace 数据绑定框架ObservableBuffer兼容的事件。

在 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]

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

4

2 回答 2

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。该错误有一个使用存在类型的解决方法,可能不适用于这种特殊情况,至少在没有大量转换的情况下不会,因为 java.util.List 类型参数位于 co 和 contra 变体位置。

于 2011-02-15T15:23:36.177 回答
-2

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

我会试试这个:

val list = new java.util.ArrayList[_]
val obsList = new ObservableList(list, null) {}
于 2011-02-14T14:54:04.073 回答