2011-02-14 25 views
4

我正在写一个需要Scala ObservableBuffer并且触发兼容Eclipse/JFace Databinding框架的事件的包装。为什么Scala会在类层次结构中存在原始类型时抱怨非法继承?

在数据绑定框架中,有一个摘要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

我不知道答案,但它的工作原理是什么时,列表是由对象而不是原始参数化? (例如'ArrayList [String]'或'ArrayList [java.lang.Integer]'?) –

+0

不,我仍然得到相同的错误。 –

+0

我不是Scala的专家,但你为什么在'ObservableList'的初始化中使用大括号?这不是一种部分功能吗?在Java中,这将是继承,但你为什么要继承它? –

回答

5

有继承层次结构中一个Java原始类型会导致这样那样的问题。一个解决方案是编写Java的一点点来修复原始类型作为答案Scala class cant override compare method from Java Interface which extends java.util.comparator

更多关于为什么原始类型是有问题的斯卡拉看到这个bug http://lampsvn.epfl.ch/trac/scala/ticket/1737。这个bug有一个使用存在类型的解决方法,可能不适用于这种特殊情况,至少不是没有大量的强制转换,因为java.util.List类型参数处于co和contra变体位置。

-2

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

我想试试这个:

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

像'new ParametrizedType [_]'这样的东西从来没有用过(在Java中'new Thing ');它不会编译。 –

相关问题