Scala 专题教程-参数化类型(5): 类型上界

jerry Scala 2015年11月25日 收藏

本篇介绍类型上界,我们使用合并排序算法来给人名排序,这里先定义一个Person类,它派生于Ordered Trait,定义如下:

  1. class Person(val firstName:String, val lastName:String)
  2. extends Ordered[Person]{
  3. def compare(that:Person) ={
  4. val lastNameComparison=
  5. lastName.compareToIngnoreCase(that.lastName)
  6. if(lastNameComparison!=0)
  7. lastNameComparison
  8. else
  9. firstName.compareToIngnoreCase(that.firstName)
  10. }
  11. override def toString= firstName + " " + lastName
  12.  
  13. }

我们先测试一下这个类对象之间的比较关系,注意Ordered Trait定义了对象之间的 >=, scala> val robert=new Person("Robert","Jones") robert: Person = Robert Jones scala> val sally = new Person("Sally","Smith") sally: Person = Sally Smith scala> robert < sally res1: Boolean = true scala> james == james1 res2: Boolean = false

我们定义merge sort 算法如下:

  1. def orderedMergeSort[T <: Ordered[T]] (xs: List[T]):List[T] ={
  2. def merge(xs:List[T],ys:List[T]):List[T] =
  3. (xs ,ys ) match {
  4. case (Nil, _) => ys
  5. case (_,Nil) => xs
  6. case (x:: xs1,y :: ys1 ) =>
  7. if (x < y) x:: merge(xs1,ys)
  8. else y :: merge( xs,ys1)
  9. }
  10.  
  11. val n = xs.length /2
  12. if(n==0) xs
  13. else {
  14. val (ys, zs)= xs splitAt n
  15. merge(orderedMergeSort(ys),orderedMergeSort(zs))
  16.  
  17. }
  18. }

这个函数要求输入的参数的类型需要派生于Ordered trait,此时你需要使用类型上界,类型上界使用 <: ordered class="brush: scala; title: ; notranslate" title=""> scala> val people = List ( | new Person("Larry","Wall"), | new Person("Anders","Hejlsberg"), | new Person("Guido","van Rossum"), | new Person("Alan","Kay"), | new Person("Yukihiro","Matsumoto") | | ) people: List[Person] = List(Larry Wall, Anders Hejlsberg, Guido van Rossum, Alan Kay, Yukihiro Matsumoto) scala> val sortedPeople=orderedMergeSort(people) sortedPeople: List[Person] = List(Anders Hejlsberg, Alan Kay, Yukihiro Matsumoto, Guido van Rossum, Larry Wall)