2012-10-15 95 views
1

我遇到類類型的問題。我有一個超級類「食用」和一個界面「多彩」。並非所有可食用的物品都是豐富多彩的,所以只有在某些食用物品上才能實現鮮豔色彩。我正在嘗試使用食用物品的ArrayList,循環它,並返回一個新的ArrayList,其中只包含豐富的ArrayList。我收到的錯誤是現在遍歷ArrayList並返回滿足實例檢查對象的ArrayList

「Add方法(七彩虹)在ArrayList類型是不適用的參數(食用)」

我怎樣才能解決這個限制?

private ArrayList<Edible> elist; 
private ArrayList<Colorful> clist; 

public List<Colorful> getColorfulItems(){ 
    for(Edible x : elist) 
     if(x instanceof Colorful){ 
      clist.add(x); 
     } 
    return clist; 

    } 

回答

5

您需要強制轉換的EdibleColorful: -

if(x instanceof Colorful){ 
     clist.add((Colorful)x); 
} 

或者,如果你想避免典型案例,與WildCard聲明你的ArrayList: -

private ArrayList<? extends Colorful> clist; 

通過聲明你的ArrayList這樣子,你可以添加任何subtypeColorful而沒有typecasting

另外,由於您的列表被聲明爲instance variable,因此您無需每次都返回修改的列表。所以這個改變會反映在列表中,而不會返回列表。

0

我將抗蝕劑使用字段作爲返回值。在這種情況下,每次調用可能不合需要的方法時,列表都會增長。

可以使該方法更通用與

@SuppressWarnings("unchecked") 
public <T> List<T> selectItems(Class<T> clazz) { 
    List<T> ret = new ArrayList<T>(); 
    for (Edible x : elist) 
     if (clazz.isInstance(x)) 
      ret.add((T) x); 
    return ret; 
} 

可以用來選擇不同的類型。

List<Serializable> serializableList = x.selectItems(Serializable.class); 
List<Colorful> colorfulList = x.selectItems(Colorful.class);