1、概述
在上一小节,我们看多一个带上界的示例
class Pair[T <: Comparable[T]]
可惜如果我们试着new 一个 Pair(4,2),编译器会抱怨说Int不是Comparable[Int]的子类型。和Java.lang.Integer包装类型不同,Scala的Int类型并没有实现Comparable。不过,RichInt实现了Comparable[Int],同时还有一个从Int到RichInt的隐士转换,隐士转换我们后边会讲解
解决方法是使用“视图界定(view bound)”,就像这样:
class Pair[T <% Comparable[T]]
<% 关系意味着T 可以被隐士转换成Comparable[T]
不过,Scala的视图界定即将推出历史舞台,如果你再编译时打开-future选项,使用视图界定将受到编译器的警告。你可以用“类型约束(type constraint)”替换视图界定,就像这样
class Pair[T](val first:T,val second:T)(implicit ev:T=> Comparable[T]){
def smaller = if (first.comparaTo(second) <0 ) first else second
}
2、实操
在Scala中,如果你想标记某一个泛型可以隐式的转换为另一个泛型,可以使用:[T <% Comparable[T]],由于Scala的Int类型没有实现Comparable接口,所以我们需要将Int类型隐式的转换为RichInt类型
class Pair5[T <% Comparable[T]](val first: T, val second: T) {
def smaller = if (first.compareTo(second) < 0) first else second
override def toString = "(" + first + "," + second + ")"
}
object Main5 extends App {
val p = new Pair5(4, 2)
println(p.smaller)
}