大数据系列修炼-Scala课程49

来源:互联网 发布:福州广电网络电视电话 编辑:程序博客网 时间:2024/05/17 23:51

大数据系列修炼-Scala课程49


核心内容:
1、Scala中型变(Variance)代码实战解析及其在Spark中的应用源码解析


1、Scala中型变(Variance)核心重点总结

1>在Java当中,若具体类型之间有相应的子类关系,在相应的泛型当中并没有相应的子类关系;然而在Scala当中,
通过型变的语法机制,可以保证在相应的泛型当中也有相同的子类关系,或者相反的子类关系;其中相同的子类关系叫做协变(+),
相反的子类关系叫做逆变(-)。
2>泛型在具体使用的时候需要指明具体的数据类型,若具体类型之间存在一种关系,而这种关系作用在泛型上时仍能保持相同或者
相反的关系,则称这个类型是可变的。
3>如果一个类型支持协变或者逆变,则称这个类型为Variance(可变的),否则称之为不可变的。
4>在Java当中,泛型类型都是不可变的InVariance,比如List并不是List的子类型,即在Java当中并不支持在定义
一个类型或者在声明一个类型时说明它具有逆变或者协变的关系;但是Scala支持,在scala当中可以在定义一个类型或者在声明一个类
型时说明它具有逆变或者协变的关系,其中用+号表示协变,用-号表示逆变。
5>型变的泛型类型并不会被子类继承,若父类声明为Variance(型变的),若子类仍想保持可变的,仍需要声明为可变类型。


实例程序1:在Java当中,泛型类型都是不可变的InVariance:

public class App1{    public static void main(String[] args)   {       ArrayList<Integer> arr = new ArrayList<Integer>(10);       arr.add(10);       arr.add(100);       //下面的写法是不对的:       //ArrayList<Object> arr = new ArrayList<Integer>(10);   }     }

实例程序2:在Scala当中,通过型变的语法机制,可以保证在相应的泛型当中也有相同的子类关系,或者相反的子类关系

class Persion  class Student extends Persionclass A[+T](val value:T)class B[+T](value:T) extends A[T](value)//协变的例子:object App6 {      def main(args:Array[String]):Unit=         {        val aa:B[Persion] = new B[Student](new Student())      //Student是Persion的父类,B[Persion]仍是B[Student]的父类。   }}

实例程序3:在Scala当中,通过型变的语法机制,可以保证在相应的泛型当中也有相同的子类关系,或者相反的子类关系

class Persion  class Student extends Persionclass A[-T]//逆变的例子:object App6 {      def main(args:Array[String]):Unit=         {        val aa:A[Student] = new A[Persion]()      //Student本来是Persion的子类,但是A[Student]是A[Persion]的父类   }

实例程序4:型变的泛型类型并不会子类继承

class Persion  class Student extends Persionclass A[+T](val aa:T)class B[+T](aa:T) extends A[T](aa)  //泛型B[T]仍然需要声明为可变中的协变//逆变的例子:object App6 {      def main(args:Array[String]):Unit=         {        val bb:B[Persion] = new B[Student](new Student)   }}
1 0
原创粉丝点击