首先我想要让大家知道的是这三个东西用来干什么的,我们在其他编程语言中常出现一个问题,如果A是B的子类,那么A的对象实例化时,可以赋值给B的引用,但是如果中间隔了一层那父、子类之间的关系就不能用了,比如生成 List[B]=new ArrayList[A]
时,就不可以了
斜变、逆变、非变就是用来解决这个问题的
package com
class Super
class Sub extends Super
//协变
class Temp1[+A](title: String)
//逆变
class Temp2[-A](title: String)
//非变
class Temp3[A](title: String)
object T_Test{
def main(args: Array[String]): Unit = {
//我们正常使用泛型的操作,就Scala中所谓的非变
var tmp3:Temp3[Sub] = new Temp3[Sub]("tmp3")
//协变
//假如 Sub是Super的子类,则Temp3[Sub]也是Temp3[Super]的子类
// 写成var tmp1:Temp3[Super] = new Temp3[Sub]("tmp3") 会报错因为Temp3是非变
var tmp1:Temp1[Super] = new Temp1[Sub]("tmp3")
//逆变
//假如 Sub是Super的子类,则可以认为Temp2[Super]是Temp2[Sub]的子类
//写成var tmp1:Temp3[Sub] = new Temp3[Super]("tmp3") 会报错因为Temp3是斜变
//逆变需要大家思路上清晰一下,它不止能让原本的父子类关系有效,还可以颠倒
var tmp2:Temp2[Sub] = new Temp2[Super]("tmp3")
}
}