Java 遍历ArrayList并返回满足instanceof检查的对象的ArrayList

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

我对班级类型有问题。我有一个超级类和一个丰富多彩的界面。并非所有可食用的物品都是彩色的,因此彩色仅在某些可食用的对象上实现。我试图获取一个可食物品的ArrayList,循环遍历它,然后返回一个只包含彩色物品的新ArrayList。我现在收到的错误是

类型ArrayList中的addColor方法不适用于参数

我怎样才能绕过这个限制

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);