Java 遍历ArrayList并返回满足instanceof检查的对象的ArrayList
我对班级类型有问题。我有一个超级类和一个丰富多彩的界面。并非所有可食用的物品都是彩色的,因此彩色仅在某些可食用的对象上实现。我试图获取一个可食物品的ArrayList,循环遍历它,然后返回一个只包含彩色物品的新ArrayList。我现在收到的错误是 类型ArrayList中的addColor方法不适用于参数 我怎样才能绕过这个限制Java 遍历ArrayList并返回满足instanceof检查的对象的ArrayList,java,interface,arraylist,superclass,instanceof,Java,Interface,Arraylist,Superclass,Instanceof,我对班级类型有问题。我有一个超级类和一个丰富多彩的界面。并非所有可食用的物品都是彩色的,因此彩色仅在某些可食用的对象上实现。我试图获取一个可食物品的ArrayList,循环遍历它,然后返回一个只包含彩色物品的新ArrayList。我现在收到的错误是 类型ArrayList中的addColor方法不适用于参数 我怎样才能绕过这个限制 private ArrayList<Edible> elist; private ArrayList<Colorful> clist; pu
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;
}
您需要将“可食”类型转换为彩色:-
或者,如果要避免使用typecase,请使用通配符声明ArrayList:-
通过像这样声明ArrayList,您可以添加任何属于Color子类型的内容,而无需进行类型转换
此外,您不需要每次都返回修改后的列表,因为您的列表被声明为实例变量。因此,更改将反映在列表中,而不返回列表。您需要将您的文件类型转换为彩色:-
或者,如果要避免使用typecase,请使用通配符声明ArrayList:-
通过像这样声明ArrayList,您可以添加任何属于Color子类型的内容,而无需进行类型转换
此外,您不需要每次都返回修改后的列表,因为您的列表被声明为实例变量。因此,更改将反映在列表中,而不返回列表。更改列表以接受任何类型的对象。了解更多 例如:
private ArrayList<? extends Colorful> clist;
更改列表以接受任何类型的对象。了解更多 例如:
private ArrayList<? extends Colorful> clist;
我会拒绝使用字段作为返回值。在这种情况下,每次调用可能不受欢迎的方法时,列表都会增加 您可以使用
@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);
我会拒绝使用字段作为返回值。在这种情况下,每次调用可能不受欢迎的方法时,列表都会增加 您可以使用
@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);