第十五课: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.关于斜变和逆变
转载于:https://my.oschina.net/u/1449867/blog/728658