Java协变和逆变

泛型的协变与逆变

协变与逆变用来描述类型转换(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时上述两个式子均不成立
题外话:有点那个高中数学里奇偶函数的那个感觉

数组是协变的

/**
 * 父类
 */
open class Car{

}

class BYD:Car(){

}

class BM{

}

class VariantTest {
    @Test
    fun arrayTest(){
        val car = arrayOf(BYD(),BM())
    }
}

如上图代码,这段代码如果运行会报错,但是如果BM这个类也继承自Car,那么就可以正常运行,通过实例我们总结如下
如果BYD是Car的子类型,那么BYD[]也是Car[]的子类型,即是协变的,Car>BYD,Car[]>BYD[]

泛型是不变的

即上述例子中
List<BYD>并不是List<Car>的子类型

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容