我遇到类类型的问题。我有一个超级“可食用”和一个界面“多彩”。并非所有可食用的物品都是五彩缤纷的,所以只有在某些可食用物品上才能实现。我正在尝试获取可食物项的ArrayList,循环它,并返回一个只包含彩色项目的新ArrayList。我现在收到的错误是
“ArrayList类型中的方法add(Colorful)不适用于参数(Edible)”
我如何解决这个限制?
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;
}
答案 0 :(得分:5)
您需要将Edible
类型转换为Colorful
: -
if(x instanceof Colorful){
clist.add((Colorful)x);
}
或者,如果您想避免使用typecase,请使用WildCard
声明您的ArrayList: -
private ArrayList<? extends Colorful> clist;
通过声明您的ArrayList
,您可以添加subtype
Colorful
typecasting
而不instance variable
此外,您不需要每次都返回修改后的列表,因为您的列表被声明为{{1}}。因此,更改将反映在列表中,而不返回列表。
答案 1 :(得分:1)
更改列表以接受Colorful
类型的任何对象。 Read Generics, Inheritance, and Subtypes了解更多信息。
示例:
private ArrayList<? extends Colorful> clist;
答案 2 :(得分: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);