Scala类型约束


    Java 中Comparable

    Scala中的比较的特质:
        Ordered 

    上界(upper Bounds)
        java中:    
        <T extends Person> 表示T类型是Person的子类型
        <? extends Person>

        scala
        [T <: Person] 此时T是Person的子类,这种形式是上界
        [_ <: Person]

        def pr(list:List[_ <: Any]):Unit={
            list.foreach(println)
        }


    //定义一个比较的方法
    class ComparaInt(a:Int, b:Int){
        def compara:Int=if(a>b) a else b
    }

    //定义比较类型
    class ComparaC[T <: Comparable[T]](o1:T, o2:T){
        def compara = if(o1.compareTo(o2)>0) o1 else o2
    }

    object UpperBounds{
        main{
            val big = new ComparaInt(1,2)
            println(big.compara)    //2

            val comc = new ComparaC(1,2)
            println(comc.compara)    //报错,int 没有extends Comparable

            val comc = new ComparaC(Integer.valueOf(1), Integer.valueOf(2))
            println(comc.compara)    //2


        }
    }

    下界(lower Bounds)
        <T super Person>
        <? super Person>

        [T >: Person]
        [_ >: Person]

    视图界定(View Bounds)
    <%
    视图界定发生了隐式转换
        class ComparaCC[T <% Comparable[T]](o1:T, o2:T){
            def big = if(o1.compareTo(o2)>0) o1 else o2
        }

        object ViewBounds {
             main{
                 val comc = new ComparaCC(1,2)
                 println(comc.big)
             }
        }


    上下文界定
        java -> comparator
        scala -> ordering

        class ComparaCCC[T:Ordering](o1:T, o2:T)(implicit comt:Ordering){
            def big = if(comt.compare(o1, o2)>0) o1 else o2
        }

        class Person(val name:String, val age:Int){
            override def toString: String = this.name +"   "+this.age
        }

        //上下文界定同样发生了隐式转换
        object ContextBounds {

            implicit val comparatorPersons = new Ordering[Personss]{
                override def compare(x:Person, y:Person):Int = x.age-y.age
            }

            main{
                val p1 = new Person("terry", 18)
                val p2 = new Person("ting", 16)

                val comc = new ComparaCCC(p1, p2)
                println(comc.big)
            }
        }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值