如何在此通用集合中添加子类型?

时间:2012-07-25 13:24:46

标签: java generics object

我希望拥有一个子类对象的集合,但是我的泛型类型实现,因为它现在在allItems.add(item);处出错,因为allItems不包含Item类型。那么如何更改以下代码而不是出错呢?

public class ItemManager {
    public static Collection<? extends Item> allItems;
    ...
    public static boolean addItem(Item item){
        return allItems.add(item);
    }
}

可能会将新项目添加为:

itemManager.add(new Bomb());

有没有办法将addItem更改为:

public static boolean addItem([all subclasses of Item] item) { ... }

或者可能更改allItems以便它可以接受ItemItem的子类?

3 个答案:

答案 0 :(得分:9)

该集合应声明为Collection<Item>

Collection<? extends Item>表示:一些未知类的集合,它是或扩展Item 。你不能在这样的集合中添加任何东西,因为你不知道它所拥有的对象的类型。

答案 1 :(得分:2)

为什么不使用T作为模板参数?

public class ItemManager<T extends Item> {
    public static Collection<T> allItems;
    ...
    public static boolean addItem(T item){
        return allItems.add(item);
    }
}

答案 2 :(得分:1)

要允许Item和任何子类,您需要使用下限声明您的集合:

public static Collection<? super Item> allItems;

这表示“元素的集合e,其中Item isSuperType(e)”

e.g。

public class Item {
}

public class SubItem extends Item {
}

public class OtherSubItem extends Item {
}

public static class ItemManager {
    public static Collection<? super Item> allItems;

    public static void addItems(){
        allItems.add(new Item());
        allItems.add(new SubItem());
        allItems.add(new OtherSubItem());
    }
}