Java协变和逆变

泛型的协变与逆变

协变与逆变用来描述类型转换(type transformation)后的继承关系,其定义如下:如果A、B表示类型,f()表示类型转换,>表示继承关系
比如A>B表示A是由B派生出来的子类,例:
f()是逆变(contravariant),当A f()是协变(covariant),当A f()是不变(invariant),当A 题外话:有点那个高中数学里奇偶函数的那个感觉

数组是协变的

/**
 * 父类
 */
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并不是List的子类型

你可能感兴趣的:(Java协变和逆变)