第44讲:Scala中View Bounds代码实战及其在Spark中的应用源码解析学习笔记

44讲:ScalaView Bounds代码实战及其在Spark中的应用源码解析学习笔记

本讲主要讲解scala中的视图界定:View Bounds

 

class Pair_NotPerfect[T <: Comparable[T]](val first : T, val second : T){

  //泛型TComparable[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){

  //泛型TComparable[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],

RichIntComparable[Int]的子类,

IntRichInt的上限。

 

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->RichIntRichIntcompareTo方法。

String->RichStringOrdered[String]<>等多种符号。

 

以上内容是从王家林老师DT大数据课程第44讲的学习笔记。
DT大数据微信公众账号:DT_Spark  

王家林老师QQ:1740415547 

王家林老师微信号:18610086859
scala44讲视频观看链接:
http://yun.baidu.com/s/1vz2cI#path=%252F
我的百度网盘共享的DT大数据梦工厂王家林老师第1-85讲的视频内容:http://pan.baidu.com/s/1qWK9CMo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值