具有协变返回类型的Java类型转换

时间:2017-05-09 14:06:16

标签: java inheritance

我使用协变返回类型创建了一个继承的小例子。基本上有三种不同的类:

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()我想获得实际模型。也许我要过度思考我的设计。

2 个答案:

答案 0 :(得分:3)

您调用方法的manager对象是BaseManager,而不是BirdManager。编译器并不知道你实际上是在调用BirdManager的方法,它只会在运行时知道,这就是你需要演员的原因。

答案 1 :(得分:0)

因为manager是BaseManager的实例而不是BirdManager。因此,您可以将它与鸟类实例一起使用,您需要对其进行类型转换。