2014-03-27 64 views
2

我想要做這樣的事情:我可以在不知道它是哪個子類的情況下創建子類的列表嗎?

public List<?> queryProducts (String type) { 
    Product p = Product.getProductByType(type); 
    List response = null; 
    if (p instanceof Dishwasher) 
     response = new ArrayList<Dishwasher>(); 
    if (p instanceof Refrigerator) 
     response = new ArrayList<Refrigerator>(); 
    // ...and so on 

    return response; 
} 

我怎麼能做到這一點,而無需通過每個子類中去?有沒有這樣的事情?

List<classOf(p)> response = new ArrayList<classOf(p)>(); 
+0

您是否嘗試過與ArrayList的''? –

回答

3

除了接受String類型的,接受Class參數與通用類型參數。

public <P extends Product> List<P> queryProducts (Class<P> clazz) { 

    List<P> response = new ArrayList<P>(); 
    ... 
    return response; 
} 

調用者可以執行

Product p = Product.getProductByType(type); 

來獲取對象,然後調用getClass()在必要的Class通過。

+0

你的方法簽名無效 – micha

+0

@micha糟糕,愚蠢的錯誤!固定。 – rgettman

+0

謝謝,這似乎工作,雖然我不知道我明白爲什麼這是有效的,「List 響應」不是。 – DevOfZot

2

只需創建:

List<Product> response = new ArrayList<Product>(); 

,爲了保持抽象

+0

感謝您的補充,有可能我應該這樣做,我將不得不考慮這一點。 – DevOfZot

+0

請參閱awsome sun/oracle教程http://docs.oracle.com/javase/tutorial/java/generics/index.html – Gaskoin

1

如果你想這樣做的一個類型安全的方式將項目添加有你有使用Class參數,而不是String

例如

public <T extends Product> List<T> queryProducts (Class<T> type) { 
    Product p = Product.getProductByType(type); // needs change 
    List response = new ArrayList<T>() 
    ...  
    return response; 
} 

然後可以調用的方法是這樣的:

List<Refrigerator> list = queryProducts(Refrigerator.class); 
相關問題