Scala语法中的协变与逆变
Scala的协变和逆变是,解决了Java中的泛型的不灵活性!
在Java中,如果有String是Object的子类,那么List<String>是不是List<Object>的子类?
答案是:否定的。因此对于开发程序造成了很多的麻烦。
java.util.List<String> list1 = new LinkedList<>();
java.util.List<Object> list2 = new LinkedList<>();
list2 = list1;
上述代码编译是不通过的
Scala只要灵活使用协变和逆变,就可以解决Java泛型的问题。
协变是可以让泛型中的子类可以继承父类。
逆变是可以让泛型中的父类逆向继承子类。
//协变
class List[+T](val str: String){
println(str) //相当于调用了构造函数
}
//逆变
class List2[-T](val str: String){
println(str) //相当于调用了构造函数
}
val list: List[Any] = new List[String]("正在协变")
val list2: List2[String] = new List2[Any]("正在逆变")
上述代码编译通过,并输出
正在协变
正在逆变