Java中的协变返回类型
当耳朵听到“压倒一切”的声音时,我们很快就知道,这可以通过不同的数据类型或传递给函数的参数来完成,这是程序员在学习Java中的多态性时最初学到的。在 JDK 5.0 之前,无法通过更改返回类型来覆盖方法。当我们重写父类方法时,子类中重写方法的名称、参数类型和返回类型必须与父类方法的名称、参数类型和返回类型完全相同。据说覆盖方法对于返回类型是不变的。
从Java 5.0 版开始,子类中的覆盖方法可以有不同的返回类型,但子类的返回类型应该是父类返回类型的子类型。覆盖方法在返回类型方面变得不同。
协变返回类型基于 Liskov 替换原则。
现在极客们一定想知道为什么要使用它,我们将列出以下优点:
- 它有助于避免混淆类层次结构中存在的类型转换,从而使代码可读、可用和可维护。
- 在重写方法时,我们可以自由地拥有更具体的返回类型。
- 帮助防止返回时出现运行时 ClassCastExceptions
Note: If we swap return types of Base and Derived, then above program would not work. Please see this program for example.
示例用于返回类型的两个类
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()