【发布时间】:2017-05-09 14:06:16
【问题描述】:
我创建了一个带有协变返回类型的继承的小例子。基本上有三个不同的类:
主应用程序:
public class MainApp {
public static void main(String[] args) {
BaseManager manager = new BirdManager();
BirdManager birds = (BirdManager) manager.getManager(); // <-- Why type cast here
// prints BirdManager
}
}
基地经理:
public abstract class BaseManager {
private Map<ManagerType, BaseManager> list = new EnumMap<>(ManagerType.class);
protected Map<ManagerType, BaseManager> getList() {
return list;
}
public abstract BaseManager getManager();
}
鸟经理:
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);
}
当我重写方法getManager() 以返回BirdManager 时,为什么我需要将BaseManager 类型转换为BirdManager?
我使用了Can overridden methods differ in return type? 作为参考。
编辑:
我有不同的子模型,它们都继承自 BaseManager。所有模型都允许存在一次。我没有为每个模型使用单例,而是尝试将这些模型添加到列表中。使用getManager(),我想获得实际模型。也许我必须过度考虑我的设计。
【问题讨论】:
-
那是因为
manager的类型是BaseManager,所以编译器只“知道”manager.getManager()返回一个BaseManager。BaseManager.getManager()的签名证实了这一点。 See this post。为什么还需要getManager()方法?
标签: java inheritance