我已经为协变返回类型创建了一个继承的小例子。有basicly三个不同的类别:具有协变返回类型的Java类型转换
MainApp:
public class MainApp {
public static void main(String[] args) {
BaseManager manager = new BirdManager();
BirdManager birds = (BirdManager) manager.getManager(); // <-- Why type cast here
// prints BirdManager
}
}
BaseManager:
public abstract class BaseManager {
private Map<ManagerType, BaseManager> list = new EnumMap<>(ManagerType.class);
protected Map<ManagerType, BaseManager> getList() {
return list;
}
public abstract BaseManager getManager();
}
BirdManager:
public class BirdManager extends BaseManager {
public BirdManager getManager() {
if (!super.getList().containsKey(ManagerType.BIRD)) {
super.getList().put(ManagerType.BIRD, this);
}
return (BirdManager) super.getList().get(ManagerType.BIRD);
}
为什么我需要强制转换BaseManager
到BirdManager
当我重写方法getManager()
返回BirdManager
?
我用Can overridden methods differ in return type?作为参考。
编辑:
我有不同的子型号,所有从BaseManager
继承。所有型号都允许存在一次。我试图将这些模型添加到列表中,而不是为每个模型使用单例。随着getManager()
我想获得实际的模型。也许我必须重新设计我的设计。
这是因为'manager'属于'BaseManager'类型,所以编译器只'知道''manager.getManager()'返回一个'BaseManager'。 'BaseManager.getManager()'的签名证实了这一点。 [见这篇文章](http://stackoverflow.com/questions/16730109/difference-between-object-type-and-reference-type)。为什么你需要'getManager()'方法呢? –