-
撒科打诨
Java支持*重写方法的协变量返回类型。这意味着重写的方法可能具有更多特定的返回类型。也就是说,只要新的返回类型可以分配给要重写的方法的返回类型,就允许这样做。例如:class ShapeBuilder {
...
public Shape build() {
....}class CircleBuilder extends ShapeBuilder{
...
@Override
public Circle build() {
....}这是在Java语言规范第8.4.5节:如果返回类型是引用类型,则返回类型可能因重写方法而异。返回类型可替换性的概念支持协变量返回,即返回类型对子类型的专门化。具有返回类型R1的方法声明D1是返回类型R2的另一个方法D2的返回类型替换,当且仅当以下条件保持:如果R1为空,则R2为空。如果R1是原语类型,则R2与R1相同。如果R1是一个参考类型,那么:R1是R2的子类型,也可以通过未经检查的转换将R1转换为R2的子类型(第5.1.9节),或R1=\x{e76f}中定义的r2的擦除。第4.6条.)*在Java 5之前,Java有不变量返回类型,这意味着与被重写的方法完全匹配所需的方法重写的返回类型。
-
开满天机
是的,它可能有所不同,但它们有一些局限性。在Java5.0之前,当您重写一个方法时,参数和返回类型都必须完全匹配。在Java5.0中,它引入了一个名为协变量返回类型的新工具。可以重写具有相同签名的方法,但返回的对象的子类。换句话说,子类中的方法可以返回一个对象,该对象的类型是该方法返回的类型的子类,在超类中具有相同的签名。
-
当年话下
是的,如果他们返回一个子类型。下面是一个例子: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 {
}}此代码编译并运行。