package cn.hanjiaxiaozhi.genericdemo
/**
* Author hanjiaxiaozhi
* Date 2020/7/17 15:47
* Desc 演示Scala中的协变、逆变、非变
*/class B//定义一个父类
class A extends B //定义一个子类继承父类//A是B的子类//XX1[A]是XX1[B]的子类---协变//XX2[A]是XX2[B]的父类---逆变//XX3[A]和XX3[B]没有关系---非变
//+表示协变class XX1[+T](msg:String)//-表示逆变class XX2[-T](msg:String)//没有+或-表示非变class XX3[T](msg:String)
object Generic_Demo3 {
def main(args: Array[String]):Unit={
//XX1是支持协变的,A是B的子类,所以XX1[A]也是XX1[B]的子类//所以可以使用父类类型接收子类对象val x1: XX1[B]=new XX1[A]("xx1")//XX2是支持逆变的,A是B的子类,所以XX1[A]是XX1[B]的父类//所以可以使用父类类型接收子类对象val x2: XX2[A]=new XX2[B]("xx2")//XX3是非变,也就是不支持逆变,也不支持非变,所以XX3[A]和XX3[B]没有关系,不能相互赋值//val x3: XX3[A] = new XX3[B]("xx3")
}}
面试题
java中—下面代码不正确
class B{
}//定义一个父类
class A extends B{
}//定义一个子类继承父类
List<A> lista =new ArrayList<>();
List<B> listb =new ArrayList<>();
listb = lista;//正确还是错误? --错误,因为Java中没有协变
scala中–下面代码正确
class B//定义一个父类
class A extends B //定义一个子类继承父类
var lista = List[A]()var listb = List[B]()
listb = lista;//正确还是错误? --正确,因为Scala的List源码为List[+A] 支持协变