我有一个方法,旨在允许我的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);
我收到一个编译失败消息,说container.getOne返回类型MyBaseClass,而赋值需要类型MyBaseClassSubclass的对象。为什么会发生这种情况?
适用于我的伴侣:
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编译。