当前位置: 首页 > 面试题库 >

Java什么是协变返回类型?

弓举
2023-03-14
问题内容

Java中的协变返回类型是什么?在一般的面向对象编程中?


问题答案:

协变返回,意味着当一个方法被覆盖时,覆盖方法的返回类型被允许为覆盖方法的返回类型的子类型。

为了举例说明,通常情况是Object.clone()-声明为返回类型Object。你可以在自己的类中重写此方法,如下所示:

public class MyFoo
{

   ...

   // Note covariant return here, method does not just return Object
   public MyFoo clone()
   {
       // Implementation
   }
}

这样做的好处是,任何持有对MyFoo对象的显式引用的方法都将能够调用clone()并知道(无需强制转换)返回值是的实例MyFoo。如果没有协变量返回类型,则必须声明MyFoo中的重写方法以返回Object-因此,调用代码将必须显式缩减方法调用的结果(即使双方都“知道”它只能是MyFoo的实例) )。

请注意,没有什么特别的,clone()并且任何重写的方法都可以具有协变量返回值-我在这里以它为例,因为它是通常有用的标准方法。



 类似资料:
  • 问题内容: 从Java 5开始,我们被允许具有协变返回类型。Java API为什么不利用此优势? 举个例子。为什么不重写以返回对象?在我看来,它将在所有情况下都向后兼容。 问题答案: 通常,这确实是为了保持向后兼容性。请注意,兼容性也必须保持在字节码级别,并且更改返回类型也会更改字节码。因此,通常来说,如果有任何子类可能覆盖了所讨论的方法,那么切换到协变返回类型将破坏这些类。 由于是抽象的,因此显

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

  • 我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别: 主应用程序: BaseManager: 鸟经理: 当我重写方法以返回时,为什么我需要将类型转换为? 我使用过的重写方法在返回类型上会有所不同吗?作为参考。 编辑: 我有不同的子模型,它们都继承自。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用,我想得到实际的模型。也许我得考虑太多了。

  • 就说,我问题的重点是学会理解jls。我相信jls中的一切都是真的。 考虑JLS下一个片段: 8.4.8.1。重写(通过实例方法) 在类C中声明的实例方法m1重写在类A中声明的另一个实例方法m2,前提是以下所有条件均为真: C是a的一个子类。 m1的签名是m2签名的子签名(§8.4.2)。 要么: m2是公共的、受保护的或在与C相同的包中声明具有默认访问权限的,或者 m1覆盖方法m3(m3不同于m1

  • 我读过这篇文章:java中arrays.aslist(array)与新arraylist (arrays.aslist(ia))之间的差异 当然,包装器上不允许一些列表操作,比如从列表中添加或删除元素,您只能读取或覆盖元素。 如果list2有List接口的引用,我期望它用Java实现List接口中包含的所有方法。https://docs.oracle.com/javase/7/docs/api/j

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