1

由于这不是那么著名的概念,我将做一点介绍。

方法的协变返回类型是在子类中重写该方法时可以用“更窄”类型替换的方法。

所以我可以很好地编译这个小程序(因为 String 是 Object 的子级):

public class House {
    Object someMethod(){
        return null;
    }
}

class DogHouse extends House{
    @Override
    String someMethod() {
        return null;
    }
}

规则很容易记住,但我不明白。我的问题是这样的:

为什么DogHouse中someMethod中的返回类型只能与类House中someMethod中的返回类型相同或子类型?我希望这个问题很清楚。

或者..(例如)如果我将返回类型放在类House中的someMethod中,为什么这段代码不会编译?(字符串不是整数的孩子) Integer

“幕后”发生了什么,所以我可以理解它?

4

1 回答 1

2

理解这一点的方法是将子类视为父类的特定类型。这意味着它仍然需要遵守父级定义的行为。父类定义了一个someMethod返回Object. 子类不能破坏这种行为,但它们可以进一步指定它 - aDogHouse仍然someMethod返回 an Object,它恰好是 a String

于 2020-08-29T20:46:13.420 回答