《快学Scala》学习笔记-第17章-类型参数

17.1 泛型类

    class Pair[T,S](val first:T,val second:S){
      def printf() = println(first,second)
    }
    val p = new Pair(42,"string")
    p.printf()

17.2 泛型函数

    def getMiddle[T](a:Array[T]) = a.length / 2
    println(getMiddle(Array(4,"56")))

17.3 类型变量界定

    class Pair[T <: Comparable[T]](val first:T,val second:T){
      def printf() = println(first,second)
      def smaller = if(first.compareTo(second) < 0) first else second
    }
    println((new Pair("23","4")).smaller)

如果不在泛型中加入<: Comparable[T],则就不知道first是否有compareTo方法,所以添加一个上界T 《: Comparable[T]

但是在类型为Int的时候出现报错,在17.4节中介绍

    class Pair[T](val first:T,val second:T){
      def printf() = println(first,second)
      def replaceFirst[R >: T](newFirst:R) = new Pair[R](newFirst,second)
    }
    (new Pair("23","4")).replaceFirst(0).printf()

17.4 视图界定

在上一节中Int类型出现报错是因为Int不是Comparable[Int]的子类。不过RichInt实现了Comparable[Int],同时还有一个从Int到RichInt的隐式转换。
解决方法是视图界定

    class Pair[T <% Comparable[T]](val first:T,val second:T){
      def printf() = println(first,second)
      def smaller = if(first.compareTo(second) < 0) first else second
    }
    println((new Pair[Int](3,4)).smaller)

<%关系将T被隐式转换成Comparable[T]

用Ordered特质会更好,因为在Comparable的基础上提供了关系操作符

    class Pair[T <% Ordered[T]](val first:T,val second:T){
      def printf() = println(first,second)
      def smaller = if(first < second) first else second
    }

17.5 上下文界定

视图界定T <% V要求必须存在一个从T到V的隐式转换。上下文界定的形式是T:M。要求必须存在一个类型为M[T]的隐式值,如

class Pair[T:Ordering]

要求必须存在一个类型为Ordering[T]的隐式值。当声明一个使用隐式值的方法时,需要添加一个隐式参数,比如ord

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

17.11 对象不能泛型

不能给对象添加类型参数,比如可变列表

更多内容请见我的个人博客:AlisaBen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值