Scala的斜变、逆变、非变

首先我想要让大家知道的是这三个东西用来干什么的,我们在其他编程语言中常出现一个问题,如果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")

  }
}


猜你喜欢

转载自blog.csdn.net/dudadudadd/article/details/113586031