第十五课:Scala类型参数编程实战

框架都很喜欢用类型系统:因为框架想包含所有的业务和变化 

 

类型系统就是:你表示某种类型,但是在声明的时候又没有表示什么类型,只在实例化的时候才表示什么类型

而且可以对类型进行限制,在Scala类型系统,把类型本身作为对象,对对象进行限制

 

其实看一下Spark的源码,就可以看到哪里都是类型系统

 

package com.dt.spark.scala.basics

 

class Animal[T](val species:T) {

  def getAnimal(species:T) = println(species)

}

 

class Person(val name:String){

  def talk(person:Person)=println(this.name+person.name)

}

 

class Worker(name:String) extends Person(name)

class Dog(val name:String)

 

class Club[T <: Person](p1:T,p2:T){

  def communicate=p1.talk(p2)

}

 

 

 

 

class Club1[T <% Person](p1:T,p2:T){

  def communicate=p1.talk(p2)

}

 

 

class Enginner

class Expert extends Enginner

 

class Meeting[+T]

 

 

class Max[T:Ordering](val x:T,val y:T){

  def bigger(implicit ord:Ordering[T]) = if(ord.compare(x, y)>0) x else y

}

 

/**

 * 1.Scala的类和方法,函数都可以是泛型,在Spark的源码中,到处都可以看到类和方法的泛型,

 * 在实例化的时候指定具体的类型,例如Spark最核心,最基础,最重要的数据结构RDD里面关于

 * RDD的类的定义是泛型,RDD中几乎所有方法的定义也都是泛型的,之所以这么做,是因为

 * RDD会派生很多子类,通过子类可以适配不同的数据源和不同的业务

 * 2.关于对类型边界的限定,分为上边界和下边界:上边界表达了泛型的类型必须是某个类或者某个类的子类,

 * 语法为 <:,这里的一个新的现象是对类型进行限定;下边界表达了必须是某种类型或者某种类型的父类,

 * 语法为 >:

 * 3.视图绑定:可以进行某种神秘的转换,把你的类型可以在没有知觉的情况下转换成为目标类型,

 * 其实你可以认为View Bound是上边界和下边界的加强类型(隐式转换),例如SparkContext中

 * 有这样的代码:T <% Writable,  它所表达的是T必须是Writable类型的,但是T又没有直接继承

 * Writable接口,此时需要通过implicit这个功能

 * 4.T:ClassTag,例如Spark 中的源码RDD,这个这个其实也是一个类型转换系统,

 * 只是编译的时候,类型信息不够,需要借助于JVM的runtime来通过运行时信息获得完整的类型信息,

 * 这在Spark中非常重要,因为Spark程序的编码和运行区分了Driver和Executor的,只有在运行的时候

 * 才知道完整的信息。

 * 5.斜变和逆变,语法为 +T 和 -T

 * String 是 Object的子类,那么List<String>就是List<Object>的子类(协变),或者List<Object>是List<String>的子类(逆变)

 * 6.Context Bounds : T : Ordering 这种方式必须能变成Ordering[T] 的方式

 */

object HelloScalaTypeSystem {

 

  def main(args:Array[String]){

    implicit def dogToPerson(dog:Dog)=new Person(dog.name)

    val p1=new Person("p1")

    val w=new Worker("w")

    val club=new Club(p1,w)

    club.communicate

 

    val dog=new Dog("dog")

 

    val club1=new Club1[Person](p1,dog)

    club1.communicate

 

    particiMeeting(new Meeting[Expert])

 

    println(new Max(2,5).bigger)

 

  }

 

  def particiMeeting(meeting:Meeting[Enginner]) = println("wel")

 

 

 

}

 

归纳总结:1.泛型是什么?

2.为什么框架都很喜欢用泛型?

3.泛型类和泛型方法,为什么RDD要用泛型?

4.关于边界限定

5.关于视图界定

6.关于上下文绑定

7.关于T:ClassTag

8.关于斜变和逆变

 

第十五课:Scala类型参数编程实战

转载于:https://my.oschina.net/u/1449867/blog/728658