Проблема с общим классом и типом класса

#java #class #generics #arraylist #arguments

Вопрос:

Я создал (универсальный) магазин класса, который я использую для получения 3 магазинов(кузница, ювелирный и книжный магазин). Магазин в основном представляет собой просто список объектов, в котором хранятся различные объекты, которые можно купить в каждом магазине. Теперь я хочу ограничить кузницу только оружием, ювелира-только кольцами и т. Д.

Я пытался понять это вот так:

     Store<Weapon> smithy = new Store<>();
    Store<Ring> jeweler = new Store<>();
    Store<Scroll> bookstore = new Store<>();
 

Однако позже я получаю ошибку в коде, потому что метод принимает только тип (Object, Store<Object>) , а не (Object,Store<Weapon>) . Но класс оружия является подклассом моего класса объектов, поэтому я не понимаю, почему это проблема.

Мой класс в магазине:

 public class Store <T extends Object>{
/...
}
 

Мой Класс Объектов:

 public class Object {

    //Konstruktor
    public Object() {
    
    }
}
 

Мой класс оружия :

 public class Weapon extends Object  {
    //Konstruktor
    public Weapon () {
        super();
    };
 

Фрагмент кода, в котором я вижу проблему:

 this.myPlayer.buy(this.smithy.getItemAt(itemNr), this.smithy);
 

Способ покупки:

 public void buy(Object obj, Store<Object> store){
//...}
 

ошибка:

 the method buy(Object,Store<Object>) in the type Player is not applicable for the arguments (Object, Store<Weapon>)
 

Так как у меня есть три разных магазина, в каждом из которых есть свои предметы(Оружие, Кольцо, Свиток). Я не могу просто изменить метод покупки на (Object, Store<Weapon>) . И написание трех методов для каждого магазина кажется мне немного чересчур.

Я ценю вашу помощь.

Комментарии:

1. Object является java.lang.Object . Вы не можете использовать это имя, выберите другое.

2. Не используйте Object в качестве имени. дженерики инвариантны; Apple это недопустимо, когда вам нужно Fruit (в то время как «обычная java» ковариантна, а яблоки и груши МОЖНО использовать, когда вам нужен фрукт). Выберите ковариацию: public void buy(Item item, Store<? extends Item> store) {} это все, что вам нужно.