我希望拥有一个子类对象的集合,但是我的泛型类型实现,因为它现在在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
的子类?
答案 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());
}
}