当前位置: 首页 > 知识库问答 >
问题:

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

马才
2023-03-14

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

应用程序

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();
}

鸟经理:

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

我使用过的重写方法在返回类型上会有所不同吗?作为参考。

编辑:

我有不同的子模型,它们都继承自BaseManager。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用getManager(),我想得到实际的模型。也许我得考虑太多了。

共有2个答案

庞旺
2023-03-14

因为manager是BaseManager的一个实例,而不是BirdManager。这样你就可以把它用在鸟类身上,你需要打字。

商高谊
2023-03-14

调用方法的管理器对象是基本管理器,而不是鸟类管理器编译器不知道您实际上正在调用BirdManager的方法,它只会在运行时被知道,这就是为什么您需要强制转换。

 类似资料:
  • 本文向大家介绍Java中的协变返回类型,包括了Java中的协变返回类型的使用技巧和注意事项,需要的朋友参考一下 协变返回类型是指重写方法的返回类型。它允许缩小重写方法的返回类型,而无需强制转换类型或检查返回类型。协变返回类型仅适用于非原始返回类型。 从Java 5开始,仅通过遵守返回类型是重写的方法返回类型的子类的条件,就可以通过更改其返回类型来覆盖方法。 示例 以下示例展示了相同的内容。 输出结

  • 这将无法编译,因为编译器只能保证是的某个子类,但不能保证的每个子类都将重写以返回自身的数组,就像我碰巧对所做的那样,因此Java只知道返回而不是。 我如何保证每个子类都用一个协变返回类型重写,以便我可以将它与泛型一起使用?

  • 问题内容: Java中的协变返回类型是什么?在一般的面向对象编程中? 问题答案: 协变返回,意味着当一个方法被覆盖时,覆盖方法的返回类型被允许为覆盖方法的返回类型的子类型。 为了举例说明,通常情况是-声明为返回类型。你可以在自己的类中重写此方法,如下所示: 这样做的好处是,任何持有对MyFoo对象的显式引用的方法都将能够调用clone()并知道(无需强制转换)返回值是的实例。如果没有协变量返回类型

  • 下面的代码来自一个名为ButterKnife的Android库。我正在弄清楚它是怎么工作的。 我试图重新创建此函数的行为: 和用法: 但是异常并非永远不会被捕获,而是在调用方法时在行中抛出。为什么? 还有,这到底是如何工作的?该方法如何知道要转换到什么?

  • 当将向量整数(即,)强制转换为双精度向量,然后对该双精度向量进行操作时,如果强制转换的返回类型为,则生成的程序集将大不相同。 换言之,使用: 相比于: 下面是戈德波特的两个例子: 返回类型:https://godbolt.org/z/0FLC4r 返回类型:https://godbolt.org/z/MGxCaL 在这里使用返回有什么后果?我原以为避免复印会更有效率,但现在我不确定。

  • (沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢