今天学习了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学习内容