2011-02-01 11 views
9

私は、すべてのクラスがIdObjectというインターフェースを実装しています(getId()メソッドを指定しています)。さらに、それらはすべて、タイプパラメータとしてそれ自体を比較<と実装しているため、それらはすべて自分自身に匹敵します。Java:それらに複数の一般的な "制約"がある変数を宣言する

私がしたいのは、そのようなオブジェクトのリストを宣言し、それを記入し、ソートしてgetId()を呼び出します。だから私のコードは次のようになります。

List<? extends IdObject & Comparable<?>> objectList = null; 

if (foo) { 
    objectList = new ArrayList<TypeA>(); 
    ... 
} else if (bar) { 
    objectList = new ArrayList<TypeB>(); 
    ... 
} 

if (objectList != null) { 
    Collections.sort(objectList); 
    for (IdObject o : objectList) { 
     System.out.println(o.getId()); 
    } 
} 

基本的に私の問題は、最初の行にある - 私は私はIDを印刷できることを確認するために最初のものを必要とするので、私はタイプ用の2つの「制約」を指定したいですループと2番目のリストでCollections.sort()を使用できることを確認してください。

最初の行はコンパイルされません。

タイプパラメータなしでジェネリックタイプを指定せず、チェックされていない操作を使用しないで、この動作を行う方法はありますか?私はインターネット上でこれの例を見つけることもできませんでした。

ごあいさつ

答えて

0

盗難防止タイプの作成はどうですか。

public CompIdObject extends IdObject implements Comparable { 
... 
} 

このタイプは一般に使用できますか?

List<? extends CompIdObject<?>> objectList = null; 
+2

警告:CompIdObjectは総称として宣言されていません。 – Nicolas

11
List<? extends IdObject & Comparable<?>> 

multiple bounded type parametersのこのタイプは、私は怖い、クラスの署名でのみ可能です。

だから私はあなたが得ることができる最も近いインターフェースを定義することであると思います。

public interface MyInterface extends IdObject, Comparable<MyInterface> 

そして、このようなあなたのリストを宣言します。

List<? extends MyInterface> objectList = null; 
+1

「MyInterface」よりも「ComparableIdObject」のほうがいいと言います。 – Raedwald

+0

@Raedwald明らかに、はい。 –

+1

'MyInterface'を実装しているすべてのクラスが他のクラスに匹敵すると本当に期待していますか?そうでない場合は、 'public interface MyInterface がIdObjectを継承し、Comparable >'と 'List <? extends MyInterface > objectList' – finnw

0

私はフィールド上で前に同様のことをやりたいと思っていましたしかし、それはできません(おそらく誰かがこれが技術的な制限か設計上の選択かどうかを精緻化することができますが、私は確信していません)。

今後の方向性は、 IDObjectとComparableを拡張している顔で、それをジェネリックリスト定義で使用します。

関連する問題