【问题标题】:Iterating through ArrayList and returning an ArrayList of the objects that meet an instanceof check遍历 ArrayList 并返回满足 instanceof 检查的对象的 ArrayList
【发布时间】:2012-10-15 15:54:30
【问题描述】:

我遇到了类类型的问题。我有一个超类“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;

    }

【问题讨论】:

    标签: java interface arraylist superclass instanceof


    【解决方案1】:

    您需要将您的Edible 类型转换为Colorful:-

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

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

    private ArrayList<? extends Colorful> clist;
    

    通过像这样声明您的ArrayList,您可以添加任何不带typecastingsubtypeColorful 的内容

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

    【讨论】:

      【解决方案2】:

      更改您的列表以接受Colorful 类型的任何对象。 Read Generics, Inheritance, and Subtypes了解更多。

      例子:

      private ArrayList<? extends Colorful> clist;
      

      【讨论】:

        【解决方案3】:

        我会拒绝使用字段作为返回值。在这种情况下,每次调用可能不受欢迎的方法时,列表都会增加。

        你可以使方法更通用

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

        【讨论】:

          猜你喜欢
          • 2018-08-04
          • 2020-02-18
          • 2015-07-22
          • 2014-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          相关资源
          最近更新 更多