2009-12-24 56 views
2

我有一個異構列表,可以包含任意類型的對象。我需要找到一個特定類型的列表元素。仔細查看其他與泛型有關的問題的答案,我沒有找到我需要的東西。如何在異構列表中找到給定類型的對象

這裏是什麼,我試圖完成一個例子:使用泛型

List <Object> list = new ArrayList <Object>(); 

... 

private someMethod() { 
    Customer cust = findInList(Customer.class); 
    Invoice inv = findInList(Invoice.class); 
} 

那麼,如何定義findInList?我收集這種類型的擦除會引起問題,我不太瞭解,但我寧願不定義多個「查找」方法,因爲列表中可能有數十種不同類型的對象。

+0

通過冗餘地提供它的類對象作爲方法參數,您已經解決了擦除問題(=您稱之爲在運行時不可用的方法的類型參數)。 – meriton 2009-12-24 19:53:37

回答

5

可以使用[Class.isInstance()http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#isInstance(java.lang.Object))和[Class.cast()http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#cast(java.lang.Object))方法定義的方法下面是一個簡單的實現(額外參數的列表)。

static <T> T findInList(List<?> list, Class<T> clazz) { 
    for (Object o : list) { 
    if (clazz.isInstance(o)) { 
     return clazz.cast(o); 
    } 
    } 
    return null; 
} 

更新:我不推薦將多種類型放入Collection這通常是一個需要自定義數據類型(例如Transaction)或Tuple值的符號

+0

您可能希望在這裏使用isAssignableFrom,因爲獲取確切的實例無關緊要,您更關心它是否擴展或實現相關類型。 – Yishai 2009-12-24 19:55:25

+0

isInstanceOf(應該是isInstance( – Shaun 2009-12-24 19:56:45

+0

)完美,我忘記了isInstanceOf方法 – SwimsZoots 2009-12-24 19:57:24

8

您可以使用由Josh Bloch描述的Typesafe Heterogeneous Container模式,這裏有一個來自Jo sh的介紹:

class Favorites { 
    private Map<Class<?>, Object> favorites = 
      new HashMap<Class<?>, Object>(); 

    public <T> void setFavorite(Class<T> klass, T thing) { 
     favorites.put(klass, thing); 
    } 

    public <T> T getFavorite(Class<T> klass) { 
     return klass.cast(favorites.get(klass)); 
    } 

    public static void main(String[] args) { 
     Favorites f = new Favorites(); 
     f.setFavorite(String.class, "Java"); 
     f.setFavorite(Integer.class, 0xcafebabe); 
     String s = f.getFavorite(String.class); 
     int i = f.getFavorite(Integer.class); 
    } 
} 

您可以很容易地擴展它以支持每個類型的收藏夾列表而不是單個值。

+0

+1 I would推薦這種方法 多一點。 – notnoop 2009-12-24 19:55:32

+0

+1我打算推薦一樣的。 – BalusC 2009-12-24 19:57:56

+0

除非你需要'null'值的支持,'setFavorite(T thing)'可以使用'thing.getClass()'作爲關鍵字。 – rsp 2009-12-24 21:20:40

相關問題