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