返回首页 Scala 参数化类型

类型上界

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

class Person(val firstName:String, val lastName:String) 
    extends Ordered[Person]{
    def compare(that:Person) ={
        val lastNameComparison=
            lastName.compareToIngnoreCase(that.lastName)
        if(lastNameComparison!=0)
            lastNameComparison
        else
            firstName.compareToIngnoreCase(that.firstName)
    }
    override def toString= firstName + " " + lastName
}

我们先测试一下这个类对象之间的比较关系,注意 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 算法如下:

def orderedMergeSort[T <: Ordered[T]] (xs: List[T]):List[T] ={
    def merge(xs:List[T],ys:List[T]):List[T] =
      (xs ,ys ) match {
        case (Nil, _) => ys
        case (_,Nil) => xs
        case (x:: xs1,y :: ys1 ) =>
          if (x < y) x:: merge(xs1,ys)
          else y :: merge( xs,ys1)
      }
    val n = xs.length /2
    if(n==0) xs
    else {
      val (ys, zs)= xs splitAt n
      merge(orderedMergeSort(ys),orderedMergeSort(zs))
    }
  }

这个函数要求输入的参数的类型需要派生于 Ordered trait,此时你需要使用类型上界,类型上界使用 <:,如本例中的 T <: Ordered[T] ,它代表类型 T 的上界是 Ordered[T],也就是说传入的参数类型必须是类型 Ordered[T]的子类。

我们之前定义的 List[Person] 满足这个条件。 比如:

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
上一篇: 类型下界