0

我想要一个子类对象的集合,但是我的泛型类型实现现在给出了一个错误,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,所以它可以接受接收一个Item和一个子类Item

4

3 回答 3

9

该集合应声明为Collection<Item>.

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

于 2012-07-25T13:28:30.787 回答
2

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

public class ItemManager<T extends Item> {
    public static Collection<T> allItems;
    ...
    public static boolean addItem(T item){
        return allItems.add(item);
    }
}
于 2012-07-25T13:33:00.927 回答
1

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

public static Collection<? super Item> allItems;

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

例如

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());
    }
}
于 2012-07-25T13:42:07.627 回答