内容:
1、View Bounds的代码实战
2、View bounds在Spark中的广泛使用
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
}
视图界定:<%
试图界定:是指我们可以把具体的传入的T类型的实例转换成Comparable[T]类型,如果comparable[T]类型不是T类型的父类,使用<%的方式可以进行隐式转换。
val pair = new Pair_NotPerfect("Spark", "Hadoop")
println(pair.bigger)
val pairInt = new Pair_NotPerfect(3, 5) //Int -> RichInt
println(pairInt.bigger)
例如:上述代码中的Pair传进了参数3,5使用Pair_NotPerfect[T<:Comparable[T]]就会报错,因为参数3和5不是Comparable[T]的子类型,这样就可以使用<%(视图界定)对其进行隐式转换(Int-> RichInt)。
Pair_NotPerfect[T<:Ordered[T]],Ordered是在Comparable方法的基础上提供了一定的关系操作符(Ordered也是trait泛型),所以可以在比较两个对象的大小的时候配合<%直接比对大小。
视图界定与隐式转换的过程:在应用类型T无法满足上界Comparable[T]的时候,使用<%做视图界定,将类型T隐式转换成Comparable[T]的子类型,例如整数类型Int会先变成RichInt类型,RichInt是以Comparable为类型上界的,所以用ComparaTo方法,即RichInt中有ComparaTo方法。