scala Bounds

Upper Bounds

在Java泛型里表示某个类型是Test类型的子类型,使用extends关键字:

这种形式也叫upper bounds(中文为上限或上界),同样的意思在scala的写法为:
[T <: Test]

Lower Bounds

在Java泛型里表示某个类型是Test类型的父类型,使用super关键字:

这种形式也叫lower bounds(中文为下限或下界),同样的意思在scala的写法为:
[T >: Test]

view bounds

view bounds 在 scala 中的写法为:
T <% A
它比 T <: A 适用的范围更广,A除了代表父类型外,还代表隐式转换的类型

下面用代码举例,对比 上界:
upper bounds(上界) 示例代码:

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

定义了一个 Pair 类,参数类型为泛型 T,<: 指 界定了泛型T 必须是 Comparable 的子类。所以参数具备 Comparable 的 compareTo 方法。

view Bounds(视图界定) 示例代码:

class Pair_Better[T <% Comparable[T] ] ( val first : T , val second : T ) {
    def bigger = if ( first.compareTo(second) > 0) first else second
}
//会报错。因为int类型不是Comparable的子类
val pairInt = new Pair(3,5)
//通过视图界定,会把数据类型进行隐式转换。这里会把 Int -> RichInt, 而 RichInt 是 Comparable的子类
val pairInt = new Pair_Better(3,5)

更优处理:

class Pair_MoreBetter[T <% Ordered[T]] (val first : T, val second : T) {
    def bigger = if ( first > second ) first else second
} 
val pairInt = new Pair_MoreBetter(3, 5) 
//Ordered 函数包含运算符的操作,比 compareTo 方法更简洁。
val pairStr = new Pair_MoreBetter("java", "Spark") 
//视图界定在这个时候,是把String隐式转换为RichString,它属Ordered子类。

context bounds

上下文界定的形式为 T : M, 其中M 必须为泛型类, 必须存在一个M[T]的隐式值。

下面的类必须存在一个隐式值 Ordering[T], 该隐式值可以用在该类的方法当中。
当声明一个使用隐式值的方法的时候, 需要添加一个"隐式参数"
ord为:隐式参数,Ordering[T]为:隐式值。隐式值比隐式转换更灵活

class Pair_Context[T : Ordering](val first: T, val second: T) {
    def smaller(implicit ord: Ordering[T]) = {
        if(ord.compare(first, second) < 0) first else second
    }
}

object Context_Bound {
    def main(args: Array[String]) {
        val pairStr = new Pair_Context("Spark", "Hadoop")
        println(pairStr.smaller)

        val pairInt = new Pair_Context(3, 5)
        println(pairInt.smaller)
    }
}

未完待续。。。
https://blog.csdn.net/lovehuangjiaju/article/details/47342301
https://blog.csdn.net/lovehuangjiaju/article/details/47342301

终于找到一个很屌的博主了:
https://blog.csdn.net/lovehuangjiaju

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1OTAwNDAzNA==&scene=124#wechat_redirect

你可能感兴趣的:(scala Bounds)