美文网首页
Java协变和逆变

Java协变和逆变

作者: crush_d872 | 来源:发表于2022-03-14 18:59 被阅读0次

泛型的协变与逆变

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

相关文章

网友评论

      本文标题:Java协变和逆变

      本文链接:https://www.haomeiwen.com/subject/ildsdrtx.html