4

Scalaを受け取り、 Eclipse /JFaceDatabindingフレームワークObservableBufferと互換性のあるイベントを発生させるラッパーを作成しています。

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]

なんで?それは生のタイプと関係がありますか?raw型を拡張するをObservableList実装します。これは予想される動作ですか。どのように回避できますか?IObservableListjava.util.List

4

2 に答える 2

5

継承階層にJavaraw型があると、この種の問題が発生します。1つの解決策は、 java.util.comparatorを拡張するJavaインターフェイスからのScalaクラスのカントオーバーライド比較メソッドの答えのように、生の型を修正するためにJavaを少し書くことです。

生の型が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 に答える