第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)
本讲主要讲解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)
相关文章推荐
- 孤独,我的宿命
- Codeforces Round #295 (Div. 1) B. Cubes(最大最小堆+拓扑模拟)
- burp suite使用(三)--- intruder收集关键信息
- Java类对象的定义和使用
- gitweb 搭建教程
- Reverse Integer
- 机器学习:逻辑回归
- 让一样的大脑,下载不一样的视频
- 正则表达式学习资料
- The resource identified by this request is only capable of generating responses with characteristics
- 高性能负载均衡软件 HAProxy
- (一一三)使用系统自带框架操作SQLite3数据库
- (一一三)使用系统自带框架操作SQLite3数据库
- HDU 5361 In Touch (使用SET集合)
- Google高级搜索技巧
- pc应用小笔记
- UVA_301_Transportation
- 【Android开源项目分析】TAB导航栏PagerSlidingTabStrip的使用和源码分析
- 智渔课堂官方免费教程六:Java基础之流程控制
- H3C FTP协议