迭代ArrayList并返回满足instanceof检查的对象的ArrayList

时间:2012-10-15 15:54:30

标签: java interface arraylist superclass instanceof

我遇到类类型的问题。我有一个超级“可食用”和一个界面“多彩”。并非所有可食用的物品都是五彩缤纷的,所以只有在某些可食用物品上才能实现。我正在尝试获取可食物项的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;

    }

3 个答案:

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