0

サブクラスオブジェクトのコレクションが必要ですが、ジェネリック型の実装では、型を保持していないallItems.add(item);ため、エラーが発生します。では、以下のコードを変更してエラーが発生しないようにするにはどうすればよいですか?allItemsItem

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

4

3 に答える 3

9

コレクションは として宣言する必要がありますCollection<Item>

Collection<? extends Item>意味: 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;

これは、「 Item isSuperType(e) である要素 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 に答える