您的位置:首页 > 其它

第81讲:Scala中List的构造时的类型约束逆变、协变、下界详解学习笔记

2015-08-09 23:26 543 查看
第81讲:Scala中List的构造时的类型约束逆变、协变、下界详解学习笔记

本讲主要讲解Scala中List的构造时的类型约束背后的运行机制

一,List的::和:::详解

二,List中的逆变、协变和下界

abstract class Big_Data //声明一个抽象的Big_Data类

class Hadoop extends Big_Data

class Spark extends Big_Data

//声明两个具体的class Hadoop和Spark都继承自Big_Data这个抽象类

object List_Constructor_Internals {

def main(args: Array[String]) {

val hadoop = new Hadoop :: Nil

//构建了元素是hadoop的Hadoop列表,其中的元素中class Hadoop类型的

val big_Data = new Spark :: hadoop

//在class Hadoop类型的列表的头部追加一个Spark类型的元素,

//Spark和Hadoop本身的类型是不一样的。

}

}

在命令终端下试运行,声明一个抽象的父类和两个具体的子类:

scala> abstract class Big_Data

defined class Big_Data

scala> class Hadoop extends Big_Data

defined class Hadoop

scala> class Spark extends Big_Data

defined class Spark

scala> val hadoop = new Hadoop :: Nil

hadoop: List[Hadoop] = List(Hadoop@11ce2e22)

//List泛型,具体类型是Hadoop,

scala> val big_Data = new Spark :: hadoop

big_Data: List[Big_Data] = List(Spark@ba354ca, Hadoop@11ce2e22)

在类型为Hadoop的List中加入了Spark,但此时命令终端的提示是此时List变成了Big_Data类型。

由原来的子类型提升为了父类型。

List.class原码分析:

def ::[B >: A] (x: B):List[B] = new scala.collection.immutable.::(x,this)

原码声明时,::操作是一个方法,这个方法的特征,这个方法是个泛型,

这里的泛型[B >: A]可以看出A是以B为上界的,B是以A为下界的,

方法的具体元素是B,因为是中值表达式,

这里是用下界的方式表达泛型,返回的是上界本身,

此时可以明白为什么List[Hadoop]类型的List为什么可以追加Spark元素。

val hadoop = new Hadoop :: Nil

val big_Data = new Spark :: hadoop

因为它会把Hadoop的父类作为上界,List[Hadoop]是List[Big_Data]类型的,

List是协变的,所以可以追加Spark类型的对象,

::是一个函数,函数是一个逆变点,x: B是逆变的位置,

List不能与元素保持一致了,要想解决这个问题,就需要用到下界的方式,

实际返回时返回父类的类型,

List[Big_Data]是List[Hadoop]的父类,

这是一个精妙和语法。一方面解决了类型错误,另一方面

让我们list可以容纳它的上界的具体的所有子类型。

让list变得非常有伸缩力。

同理List的连接方法:::也是返回上界类型,:::的源码如下:

def :::[B >: A](prefix: List[B]): List[B] = ........

以上内容是从王家林老师DT大数据课程第81讲的学习笔记。

DT大数据微信公众账号:DT_Spark

王家林老师QQ:1740415547

王家林老师微信号:18610086859

scala第81讲视频观看链接:
http://yun.baidu.com/s/1uLFye
我的百度网盘共享的DT大数据梦工厂王家林老师第1-81讲的视频内容:http://pan.baidu.com/s/1qWK9CMo

今日【DT大数据梦工厂视频】《第81讲:Scala中List的构造是的类型约束逆变、协变、下界详解》

土豆视频:http://www.tudou.com/programs/view/ceac2IoB-ik/

51CTO视频:http://edu.51cto.com/lesson/id-71116.html

腾讯视频:http://v.qq.com/boke/page/f/0/m/f0161zujhpm.html

56网视频:http://www.56.com/u59/v_MTM4MzE1NjMy.html

(DT大数据梦工厂scala的所有视频、PPT和代码在百度云盘的链接:http://url.cn/fSFPjS)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: