第44讲:Scala中View Bounds代码实战及其在Spark中的应用源码解析学习笔记
本讲主要讲解scala中的视图界定:View Bounds
class Pair_NotPerfect[T <: Comparable[T]](val first : T, val second : T){
//泛型T是Comparable[T]的子类。
def bigger = if(first.compareTo(second) > 0)first else second
}
val pair new Pair_NotPerfect("Spark","Hadoop")
//返回Spark
println(pair.bigger)
}
假设val pair new Pair_NotPerfect(3,5)则会报错:类型不匹配。
因为传入的参数必须是Comparable[T]的子类,
虽然整数是T类型的,但整数本身不是Comparable[T]的子类。
修改一下代码:
class Pair_NotPerfect[T <% Comparable[T]](val first : T, val second : T){
//泛型T是Comparable[T]的子类。
def bigger = if(first.compareTo(second) > 0)first else second
}
class Pair_Better[T <% Ordered[T]](val first : T, val second : T){
//泛型T如果可以被视图界定为Ordered[T]的话,
//可以使用Ordered[T]的<或>号,Ordered[T]在Comparable[T]的基础上提供了具体的操作符。
//这样更符合人们的习惯。所以Ordered更常用。
//字符串本身不是Ordered[String]约束的实例。即
def bigger = if(first > second )first else second
}
object View_Bounds {
def main(args: Array[String]) {
val pair new Pair_NotPerfect("Spark","Hadoop")
//返回Spark
println(pair.bigger)
val pair new Pair_NotPerfect(3,5)
//返回5
println(pair.bigger)
val pair_Better_String = new Pair_Better("Java","Scala")
//String被隐式转换成了RichString
println(pair_Better_String.bigger)
val pair_Better_Int = new Pair_Better(20,12)
println(pair_Better_Int.bigger)
}
这样就不报错了。只是把<:改成了<%
<%学术名称就叫视图界定,具体是指可以把传入的T类型的实例转换成Comparable[T]类型。
如果Comparable[T]不是T的父类的话。
T类型本身不是Comparable[T]类型的,但通过视图界定,把它隐式地转换成了Comparable[T]类型。
内部有隐式转换,把Int转换成了RichInt,而RichInt实现了Comparable[Int],
RichInt是Comparable[Int]的子类,
Int是RichInt的上限。
sparkContext中的源码:
def rddToSequenceFileRDDFunctions[K <% Writable: ClassTag, V <% Writable: ClassTag](
rdd: RDD[(K,V)]): SequenceFileRDDFunctions[K,V] = {
val kf = implicitly[K => Writable]
val vf = implicitly[V => Writable]
//Set the Writable class to null and 'SequenceFileRDDFunctions' will use Reflection
implicit val keyWritableFactory = new WritableFactory[K](_ => null,kf)
implicit val valueWritableFactory = new WritableFactory[V](_ => null,vf)
RDD.rddToSequenctFileRDDFunction(rdd)
}
总结一下视图界定:就是当类型变量上界无法满足使用时,可以把T转换成Comparable[T]类型
背后事实上是自动作了隐式转换:
Int->RichInt,RichInt有compareTo方法。
String->RichString,Ordered[String]有<>等多种符号。
以上内容是从王家林老师DT大数据课程第44讲的学习笔记。
DT大数据微信公众账号:DT_Spark
王家林老师QQ:1740415547
王家林老师微信号:18610086859
scala第44讲视频观看链接:
http://yun.baidu.com/s/1vz2cI#path=%252F
我的百度网盘共享的DT大数据梦工厂王家林老师第1-85讲的视频内容:http://pan.baidu.com/s/1qWK9CMo