2011-02-14 28 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 ');它不會編譯。 –

相關問題