今天学习了view bounds的内容,来看下面的代码。

//class Pair[T <: Comparable[T]](val first : T,val second : T){
//  def bigger = if(first.compareTo(second) > 0) first else second
//}

class Pair_NotPerfect[T <% Comparable[T]](val first : T,val second : T){
  def bigger = if(first.compareTo(second) > 0) first else second
}

class Pair_Better[T <% Ordered[T]](val first : T,val second : T){
  def bigger = if(first  > second) first else second
}

object View_Bounds {
 
  def main(args:Array[String]){
    val pair = new Pair_NotPerfect("Spark","Hadoop")
    println(pair.bigger)
   
    val pairInt = new Pair_NotPerfect(3,5)//Int => RichInt
    println(pairInt.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)
   
  
  }
}

昨天学习了界定,但是,如果用昨天界定的代码中的类pair来处理Int型的数字的话,会报错,原因是int不是comparable的类型。这时,我们就用到了另外一种方法:视图界定。

class Pair_NotPerfect[T <% Comparable[T]](val first : T,val second : T){
  def bigger = if(first.compareTo(second) > 0) first else second
}

可以看出,它将<:变成了<%,这样做的结果就是,当遇到int类型这样的没有comparable方法的类型的数据的时候,可以隐式转换为带有comparable方法的类型。如,可以将int转换为RichInt。

val pairInt = new Pair_NotPerfect(3,5)//Int => RichInt
    println(pairInt.bigger)

这样一来,可就以使用comparable的方法了。可是,这样还不是很完美。我们在使用中喜欢使用带有直接比较的运算,比如a > b,说是,下面的类就出现了,它是Comparable[T]的升级版本。

class Pair_Better[T <% Ordered[T]](val first : T,val second : T){
  def bigger = if(first  > second) first else second
}

Ordered[T],它带有直接的比较方法,如>,<,=等。这样一来,我们就可以在代码中直接使用此方法进行比较。

val pair_Better_String = new Pair_Better("java","scala")//String => RichString
    println(pair_Better_String.bigger)

分享下更多的scala资源吧:

百度云盘:http://pan.baidu.com/s/1gd7133t

微云云盘:http://share.weiyun.com/047efd6cc76d6c0cb21605cfaa88c416

360云盘: http://yunpan.cn/cQN9gvcKXe26M (提取码:13cd)

信息来源于 DT大数据梦工厂微信公众账号:DT_Spark

关注微信账号,获取更多关于scala学习内容

第44讲:Scala中View Bounds代码实战及其在Spark中的应用源码解析的更多相关文章

  1. 第45讲:Scala中Context Bounds代码实战及其在Spark中的应用源码解析

    今天学业习了上下文界定的内容,看下这段代码 class Pair_Ordering[T:Ordering](val first : T,val second : T){  def bigger(imp ...

  2. 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析

    今天学习了scala的界定,先来看看下面这段代码 //class Pair[T] (val first : T,val second : T)class Pair[T <: Comparable ...

  3. Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  4. Scala 深入浅出实战经典 第48讲:Scala类型约束代码实战及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. Scala 深入浅出实战经典 第47讲:Scala多重界定代码实战及其在Spark中的应用

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  6. Scala 深入浅出实战经典 第44讲: scala中view bounds代码实例

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  7. 第47讲:Scala多重界定代码实战及其在Spark中的应用源码解析

    今天学习了scala的多重界定 T >: A <: B 表示T同时有下界和下界,下界为A,上界为B,A为B的子类型.下界必须写在前面,上界必须写在后面,位置不能颠倒. T<:A wi ...

  8. Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. Scala 深入浅出实战经典 第65讲:Scala中隐式转换内幕揭秘、最佳实践及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

随机推荐

  1. Linux下编译带x264的ffmpeg的配置方法,包含SDL2

    一.环境准备 ffmpeg下载:http://www.ffmpeg.org/download.html x264下载:http://download.videolan.org/x264/snapsho ...

  2. JavaScript笔记:数据类型

    javascript中有5种基本数据类型:Undefined,Null,Boolean,Number和String,还有一种复杂的数据类型--Object.javascript不支持任何创建自定义类型 ...

  3. SQLServer 常用日期处理

    select GETDATE() as '当前日期',DateName(year,GetDate()) as '年',DateName(month,GetDate()) as '月',DateName ...

  4. MyBatis学习总结(六)——调用存储过程

    一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...

  5. C++中关于string类型究竟能不能用cout输出的问题

    先让我讲下故事哈 一次在MFC中用cout输出一个string类型字符串,编译时出现这样一个错误: error C2679: binary '<<' : no operator defin ...

  6. VS2013使用EF6连接MySql

    前提:a.安装MySql的VS插件(版本请下载最新版) 我用的是:mysql-for-visualstudio-1.1.4 b.安装用于.net连接程序  mysql-connector-net-6. ...

  7. mysql之导入与导出

    SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据.但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏, ...

  8. objective c,copy, mutableCopy区别

    copy总是返回不能被修改的对象,mutableCopy返回可以被修改的对象 例: NSArray *array = @[@"test", @"test2"]; ...

  9. 第19章 queue队列容器

    /* 第19章 queue队列容器 19.1 queue技术原理 19.2 queue应用基础 19.3 本章小结 */ // 第19章 queue队列容器 // 19.1 queue技术原理 // ...

  10. delete drop truncate 区别

    truncate 删除内容,并释放空间,并不删除表结构,删除标识列,标识列重新从1开始delete 删除内容,不释放空间,不删除表结构,不删除标识列,标识列继续增加drop 直接删除表