У меня проблема с общими классами в Java.
У меня есть этот класс:
public abstract class MyMotherClass<C extends AbstractItem>
{
private C item;
public void setItem(C item)
{
this.item = item;
}
public C getItem()
{
return item;
}
}
Реализация этого класса может быть:
public class MyChildClass extends MyMotherClass<ConcreteItem>
{
}
ConcreteItem - это простой класс, расширяющий AbstractItem (который является абстрактным).
поэтому у MyChildClass есть ConcreteItem, и я могу использовать:
MyChildClass child = new MyChildClass();
child.setItem(new ConcreteItem());
// automatic cast due to generic class
ConcreteItem item = child.getItem();
Хорошо, на данный момент все хорошо. Вот проблема:
Теперь я хочу извлечь из коллекции экземпляр MyMotherClass и установить его элемент (тип которого неизвестен):
Map<String, MyMotherClass> myCollection = new HashMap<String, MyMotherClass>();
Map<String, AbstractItem> myItems = new HashMap<String, AbstractItem>();
// fill the 2 collections
...
MyMotherClass child = myCollection.get("key");
child.setItem(myItems.get("key2"));
Если я так делаю, он запускается.
НО у меня есть предупреждение, потому что MyMotherClass является универсальным типом, и я не использую универсальный тип.
Но я не знаю, какой тип моего извлеченного ребенка, поэтому я хочу использовать подстановочный знак:
Map<String, MyMotherClass<?>> myCollection = new HashMap<String, MyMotherClass<?>>();
Map<String, AbstractItem> myItems = new HashMap<String, AbstractItem>();
// fill the 2 collections
...
MyMotherClass<?> child = myCollection.get("key");
child.setItem(myItems.get("key2"));
И вот проблема: у меня ошибка компиляции, которая говорит:
Метод setItem (capture # 1-of?) В типе MyMotherClass не применим для аргументов (AbstractItem)
и когда я пытаюсь использовать унаследованный шаблон, та же проблема:
Map<String, MyMotherClass<? extends AbstractItem>> myCollection = new HashMap<String, MyMotherClass<? extends AbstractItem>>();
Map<String, AbstractItem> myItems = new HashMap<String, AbstractItem>();
// fill the 2 collections
...
MyMotherClass<? extends AbstractItem> child = myCollection.get("key");
child.setItem(myItems.get("key2"));
что я могу сделать?
спасибо и извините за мой английский, который не очень хорошо;)