我在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"));
这就是问题所在:我有一个编译错误,上面写着:MyMotherClass 类型中的方法 setItem(capture#1-of ?) 不适用于参数(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"));
我能做些什么 ?
感谢并为我不太流利的英语感到抱歉;)