我使用协变返回类型创建了一个继承的小例子。基本上有三种不同的类:
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?作为参考。
修改
我有不同的SubModel,它们全部都来自BaseManager
。允许所有模型存在一次。我尝试将这些模型添加到列表中,而不是为每个模型使用单身人士。使用getManager()
我想获得实际模型。也许我要过度思考我的设计。
答案 0 :(得分:3)
您调用方法的manager
对象是BaseManager
,而不是BirdManager
。编译器并不知道你实际上是在调用BirdManager
的方法,它只会在运行时知道,这就是你需要演员的原因。
答案 1 :(得分:0)
因为manager是BaseManager的实例而不是BirdManager。因此,您可以将它与鸟类实例一起使用,您需要对其进行类型转换。