在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ 類型上界
信息隱藏
類型上界
Variance(類型變體)標(biāo)識
概述和例子說明
類型下界

類型上界

本篇介紹類型上界,我們使用合并排序算法來給人名排序,這里先定義一個 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
}

我們先測試一下這個類對象之間的比較關(guān)系,注意 Ordered Trait 定義了對象之間的<,>,>=,<=關(guān)系。

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

這個函數(shù)要求輸入的參數(shù)的類型需要派生于 Ordered trait,此時你需要使用類型上界,類型上界使用 <:,如本例中的 T <: Ordered[T] ,它代表類型 T 的上界是 Ordered[T],也就是說傳入的參數(shù)類型必須是類型 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
上一篇:信息隱藏