41.List继承体系实现内幕和方法操作源码揭秘

来源:互联网 发布:白衣服发黄 知乎 编辑:程序博客网 时间:2024/06/03 22:48

一、List的继承体系分析和源码解读

1.List类

abstract class List[+A]  ...

List是抽象的类,我们平时用List(1,2,3)来构建一个List对象,用的都是其伴生对象的apply方法

2.List有两个子类Nil和::

这两个子类都实现了其成员方法isEmpty、head、tail

 //*  This class comes with two implementing case classes `scala.Nil` //*  and `scala.::` that implement the abstract members `isEmpty`, //*  `head` and `tail`.

3.::类

final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {  override def tail : List[B] = tl  override def isEmpty: Boolean = false}

tail和isEmpty都是函数,我们平时调用一个List的tail时,使用的是其方法而并非成员

由于scala是面向对象+函数式编程的,所以其方法也可以说成是属性。属性和函数都是一等公民,可以相互转换

4.List类的具体实现

sealed abstract class List[+A] extends AbstractSeq[A]                                  with LinearSeq[A]                                  with Product                                  with GenericTraversableTemplate[A, List]                                  with LinearSeqOptimized[A, List[A]]                                  with Serializable {  ... }

   sealed:进行模式匹配时,List所有具体的子类都必须在List类所在的这个文件中。这样,在进行模式匹配时,scala就知道其所有的实现

   List[+A] :元素类型有相应的继承体系,那么List也会有相应的继承体系。eg:因为Any是Int的父类,所以List[Any]是List[Int]的父类

例如:

    val list : List[Int] = List(1,2,3,4,5)     val listAny : List[Any] = list
可以把list赋值给listAny。属于面向接口编程,可以把子类对象赋值给父类变量


二、List方法操作源码

  println(list.drop(2))
看drop()源码:

override def drop(n: Int): List[A] = {    var these = this    var count = n    while (!these.isEmpty && count > 0) {      these = these.tail      count -= 1    }    these  }

scala的丰富多彩造就了其强大的功能特性,后面会逐步讲解。


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



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