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)
}
}