泛型的协变与逆变
协变与逆变用来描述类型转换(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>的子类型