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

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

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

一,List:::::详解

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

 

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

class Hadoop extends Big_Data

class Spark extends Big_Data

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

object List_Constructor_Internals {

    def main(args: Array[String]) {

val hadoop = new Hadoop :: Nil

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

val big_Data = new Spark :: hadoop

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

//SparkHadoop本身的类型是不一样的。

    }

}

 

 

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

 

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)

在类型为HadoopList中加入了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
scala81讲视频观看链接:
http://yun.baidu.com/s/1uLFye
我的百度网盘共享的DT大数据梦工厂王家林老师第1-81讲的视频内容:http://pan.baidu.com/s/1qWK9CMo

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

土豆视频: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值