Lau*_*ves 167

Java支持用于重写方法的*协变返回类型.这意味着重写的方法可能具有具体的返回类型.也就是说,只要新的返回类型可以分配给您重写的方法的返回类型,就允许它.

例如:

class ShapeBuilder {
    ...
    public Shape build() {
    ....
}

class CircleBuilder extends ShapeBuilder{
    ...
    @Override
    public Circle build() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

在Java语言规范的8.4.5节中指定:

如果返回类型是引用类型,则返回类型可能会因覆盖彼此的方法而异.返回类型可替代性的概念支持协变返回,即返回类型到子类型的特化.

返回类型为R1的方法声明d1是返回类型 - 可替代另一个返回类型为R2的方法d2,当且仅当以下条件成立时:

  • 如果R1无效,则R2无效.

  • 如果R1是基本类型,则R2与R1相同.

  • 如果R1是引用类型,则:

    • R1是R2的子类型,或者R1可以通过未经检查的转换(第5.1.9节)转换为R2的子类型,或者

    • R1 = | R2 |

("| R2 |"指的是R2的擦除,如JLS的§4.6中所定义.)


*在Java 5之前,Java具有不变的返回类型,这意味着需要与被覆盖的方法完全匹配的方法覆盖的返回类型.


Pan*_*yal 22

是的它可能有所不同,但它们有一些限制.

在Java 5.0之前,当您重写方法时,参数和返回类型必须完全匹配.在Java 5.0中,它引入了一个名为协变返回类型的新工具.您可以使用相同的签名覆盖方法,但返回返回的对象的子类.换句话说,子类中的方法可以返回一个对象,该对象的类型是由超类中具有相同签名的方法返回的类型的子类.


Dan*_*lan 18

是的,如果他们返回一个子类型.这是一个例子:

package com.sandbox;

public class Sandbox {

    private static class Parent {
        public ParentReturnType run() {
            return new ParentReturnType();
        }
    }

    private static class ParentReturnType {

    }

    private static class Child extends Parent {
        @Override
        public ChildReturnType run() {
            return new ChildReturnType();
        }
    }

    private static class ChildReturnType extends ParentReturnType {
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码编译并运行.


小智 8

从广义上讲,返回类型的重写方法可能不同.但它并非直截了当,有一些案例涉及到这一点.

情况1:如果返回类型是原始数据类型或void.

输出:如果返回类型为void或primitive,则父类方法和重写方法的数据类型应相同.例如,如果返回类型是int,float,string那么它应该是相同的

情况2:如果返回类型是派生数据类型:

输出:如果父类方法的返回类型是派生类型,则覆盖方法的返回类型与派生数据类型的子类的派生数据类型相同.例如假设我有一个类A B是子类,A C是子类,B D是C的子类,那么如果超类返回类型A那么重写方法是子类可以返回A,B,C或D类型,即它的子类型.这也称为协变.


小智 5

是有可能..收益类型可以是不同的只有父类方法的返回类型为
超类型的子类方法的返回类型..
手段

class ParentClass {
    public Circle() method1() {
        return new Cirlce();
    }
}

class ChildClass extends ParentClass {
    public Square method1() {
        return new Square();
    }
}

Class Circle {

}

class Square extends Circle {

}
Run Code Online (Sandbox Code Playgroud)

如果是这样的话可以允许不同的返回类型......