关于逆变与协变相关知识,可以参考之前的章节。
这里主要是对 list 中 cons(::) 操作过程讲解
代码
abstract class Big_Data
class Hadoop extends Big_Data
class Spark extends Big_Data
object List_Constructor_Internals {
def main(args: Array[String]) {
val hadoop = new Hadoop:: Nil
val big_data = new 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@654b72c0)
scala> val big_data = new Spark::hadoop
big_data: List[Big_Data] = List(Spark@3f29e26, Hadoop@654b72c0)
通过运行,发现 val big_data = new Spark::hadoop,操作后,返回的是 List[Big_Data]
由于此操作是对list 的::操作, 可以肯定由此操作引起的,下面是::操作源代码
def ::[B >: A](x : B) : scala.collection.immutable.List[B] = { /* compiled code */ }
通过源码发现返回值为 List[B] 是基类,是协变, 参数 是 逆变的过程
当传入 new Spark 参数时,scala 编译器自动转化为其父类型 Big_Data
参考资料:
百度网盘:http://pan.baidu.com/share/home?uk=4013289088#category/type=0
微信号:18610086859
DT大数据微信公众账号:DT_Spark
DT大数据梦工厂交流群:① 462923555 ②418110145 ③437123764