1

我遇到了类类型的问题。我有一个超类“Edible”和一个界面“Colorful”。并非所有可食用物品都是彩色的,因此仅在某些可食用物品上实现了彩色。我正在尝试获取可食用物品的 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;

    }
4

3 回答 3

5

您需要将您的类型转换EdibleColorful:-

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

或者,如果您想避免类型大小写,请使用以下方式声明您的 ArrayList WildCard:-

private ArrayList<? extends Colorful> clist;

通过ArrayList这样声明,您可以添加任何没有subtypeColorfultypecasting

此外,您不需要每次都返回修改后的列表,因为您的列表被声明为instance variable. 因此更改将反映在列表中,而不返回列表。

于 2012-10-15T15:55:55.530 回答
1

更改您的列表以接受任何类型的对象Colorful阅读泛型、继承和子类型以了解更多信息。

例子:

private ArrayList<? extends Colorful> clist;
于 2012-10-15T15:56:20.387 回答
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);
于 2012-10-15T16:01:15.767 回答