49.Scala中Variance代码实战及其在Spark中的应用源码解析

来源:互联网 发布:虚拟机的网络模式 编辑:程序博客网 时间:2024/05/16 14:10


eg: List[T] A:父类 B:子类  List[A]是否是List[B]的父类? 是的话,可以进行型变(协变)
协变:和具体类型的继承关系是一致的。比如A是B的父类,List[A]是List[B]的父类
逆变:和具体类型的继承关系是相反的。比如A是B的父类,List[B]是List[A]的父类

但是在Java中,String是Obejct的子类,List[String]并不是List[Object]的子类。
而且Java并不支持在定义一个类型时声明它为协变或逆变的情况。
只有在使用时才可以这么表达,例如:
List<? extends Object> list = new ArrayList<String>()  //String是Object的子类,ArrayList[String]是List[Object]的子类。

在scala中可以这么表达同样的意思:
val list : List[_ <: Any] = List[String]("Spark")

class Personclass Student extends Personclass C[+T](val args : T)//注意一点:如果要继承一个型变的泛型类型,那具体子类也必须保持是型变的。class S[+T](arg : T) extends C[T](arg)trait Friend[-T]{  def makeFriend(somebody : T)}object Variance_49 {  def makeFriendWithYou(s : Student, f : Friend[Student]){ f.makeFriend(s) }  def main(args: Array[String]): Unit = {   val value : C[Person] = new C[Student](new Student) }}


因为在scala中可以表达这种语法,所以在Spark中很少看到类似这样(C[+T])的表达。


参考资料来源于大数据梦工厂 深入浅出scala 第49讲 由王家林老师讲解



阅读全文
0 0
原创粉丝点击