📜  Java中的协变返回类型

📅  最后修改于: 2022-05-13 01:54:19.776000             🧑  作者: Mango

Java中的协变返回类型

当耳朵听到“压倒一切”的声音时,我们很快就知道,这可以通过不同的数据类型或传递给函数的参数来完成,这是程序员在学习Java中的多态性时最初学到的。在 JDK 5.0 之前,无法通过更改返回类型来覆盖方法。当我们重写父类方法时,子类中重写方法的名称、参数类型和返回类型必须与父类方法的名称、参数类型和返回类型完全相同。据说覆盖方法对于返回类型是不变的。

从Java 5.0 版开始,子类中的覆盖方法可以有不同的返回类型,但子类的返回类型应该是父类返回类型的子类型。覆盖方法在返回类型方面变得不同

协变返回类型基于 Liskov 替换原则。

现在极客们一定想知道为什么要使用它,我们将列出以下优点:

  • 它有助于避免混淆类层次结构中存在的类型转换,从而使代码可读、可用和可维护。
  • 在重写方法时,我们可以自由地拥有更具体的返回类型。
  • 帮助防止返回时出现运行时 ClassCastExceptions

示例用于返回类型的两个类

Java
// Java Program to Demonstrate Different Return Types
// if Return Type in Overridden method is Sub-type
 
// Class 1
class A {
}
 
// Class 2
class B extends A {
}
 
// Class 3
// Helper class (Base class)
class Base {
 
    // Method of this class of class1 return type
    A fun()
    {
        // Display message only
        System.out.println("Base fun()");
 
        return new A();
    }
}
 
// Class 4
// Helper class extending above class
class Derived extends Base {
 
    // Method of this class of class1 return type
    B fun()
    {
        // Display message only
        System.out.println("Derived fun()");
 
        return new B();
    }
}
 
// Class 5
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of class3 type
        Base base = new Base();
 
        // Calling method fun() over this object
        // inside main() method
        base.fun();
 
        // Creating object of class4 type
        Derived derived = new Derived();
 
        // Again calling method fun() over this object
        // inside main() method
        derived.fun();
    }
}


输出:

Base fun()
Derived fun()