#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) {}
это все, что вам нужно.