协变返回类型
一句话概括:
子类覆盖父类方法,返回类型可以是,父类返回类型的子类。
举例:
class Processor {
public String name() {
return getClass().getSimpleName();
}
Object process(Object input) {
return input;
}
}
class Upcase extends Processor {
String process(Object input) {
return ((String) input).toUpperCase(); // 这里就是协变返回类型
}
}
解释:基类Processor中process函数的返回类型是Object类型,是所有类的根类,所以Prossor的子类的返回类型可以是任意类型,当然包括这个字符串类型。
补充:
逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型,f(⋅)表示类型转换,≤表示继承关系(比如,A≤B表示A是由B派生出来的子类)
- f(⋅)是逆变(contravariant)的,当A≤B时有f(B)≤f(A)成立;
- f(⋅)是协变(covariant)的,当A≤B时有f(A)≤f(B)成立;
- f(⋅)是不变(invariant)的,当A≤B时上述两个式子均不成立,即f(A)与f(B)相互之间没有继承关系。
这里的f(A)和f(B)可以粗浅地理解为一个函数的返回值(如有错误,欢迎指正)。
参考:1、《Java编程思想》(第四版)2、https://www.jianshu.com/p/2bf15c5265c5