2011-02-01 98 views
9

我有一堆java中的所有類實現了一個名爲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中循環和第二個,以確保我可以在列表上使用Collections.sort()。

第一行不編譯。

有沒有辦法使這項工作沒有指定沒有類型參數和使用未經檢查的操作的泛型?我在互聯網上也找不到這樣的例子。

問候

回答

0

如何創建antoher類型;

public CompIdObject extends IdObject implements Comparable { 
... 
} 

並使用此類型爲您的仿製藥?

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

警告:您的CompIdObject未聲明爲通用。 – Nicolas 2011-02-01 10:12:44

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 2011-02-01 13:09:21

0

我想之前做類似的事情上的字段但它不能完成(或許有人可以詳細說明這是技術限制還是設計選擇,我不確定)。

未來的方向是設計一個inter面對擴展IdObject和Comparable,然後在通用列表定義中使用它。