协变返回类型

一句话概括:

子类覆盖父类方法,返回类型可以是,父类返回类型的子类。

举例:

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

posted @ 2020-09-07 16:28  模糊计算士  阅读(243)  评论(0编辑  收藏  举报