我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别:
主应用程序:
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()
,我想得到实际的模型。也许我得考虑太多了。
因为manager是BaseManager的一个实例,而不是BirdManager。这样你就可以把它用在鸟类身上,你需要打字。
调用方法的管理器
对象是基本管理器
,而不是鸟类管理器
。编译器不知道您实际上正在调用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为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢