我有一个方法,旨在允许我的SDK的使用者从内部存储中提取对象。这些对象继承自作为泛型类的基类。对象的真实类型是确定性的,并且只有消费者才知道。设置如下:
public class MyBaseClass<T> {
...
}
public class TheBaseClassContainer {
private Map<String, MyBaseClass> container;
public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) {
return clazz.cast(this.container.get(id));
}
}
这个想法是消费者可以简单地指定他们期待的课程,我们将处理剩下的课程。不幸的是,当我这样称呼这个方法时:
TheBaseClassContainer container = ...;
MyBaseClassSubclass subclass = container.getOne("myId", MyBaseClassSubclass.class);
我得到编译失败,说容器.getOne返回类型MyBaseClass,并且赋值期望一个MyBaseClassSubclass类型的对象。为什么会这样?
答案 0 :(得分:0)
为我工作的伙伴:
class MyBaseClass<T> {
}
class B extends MyBaseClass<Integer>{}
class TheBaseClassContainer {
private Map<String, MyBaseClass> container;
public <T extends MyBaseClass> T getOne(String id, Class<T> clazz) {
return clazz.cast(this.container.get(id));
}
}
用法:
TheBaseClassContainer theBaseClassContainer = new TheBaseClassContainer();
B asd = theBaseClassContainer.getOne("asd", B.class);
在Java 7中编译。