Array[T]
class 中,用於定義變量、入參、返回值數組
class Pair[T, S](val first: T, val second: S) // scala 可自動推斷具體的類型 val p = new Pair(42, "String") // Pair[Int, String]
函數、方法函數
def getMiddle[T](a: Array[T]) = a(a.length / 2)
類型邊界測試
上邊界 T <: UpperBound
優化
// 比較大小 class Pair[T](val first: T, val second: T) { def smaller = if (first.compareTo(second) < 0) first else second }
沒法肯定 first 是否存在
compareTo
方法,因此必須添加約束,fist 必須是Comparable
的子類型,即須要添加上邊界scala
class Pair[T <: Comparable[T]](val first: T, val second: T) { def smaller = if (first.compareTo(second) < 0) first else second }
下邊界 T >: LowerBound
code
// 替換第一個元素 class Pair[T](val first: T, val second: T) { def replaceFirst(newFirst: T) = new Pair[T](newFirst, second) }
替換第一個元素爲 T 的父類 R,那麼返回類型是什麼? 若是須要返回 R,則須要添加約束,即須要下邊界;不然返回的類型爲 Anyci
// 返回類型自動推斷爲 new Pair[R] def replaceFirst[R >: T](newFirst: R) = new Pair(newFirst, second)
上下文邊界 T : ContextBound
get
Scala 2.8 對 Array
進行了更新優化,使用隱式轉換和 manifest 將數組整合爲 Scala 的集合庫it
def tabulate[T](len: Int, f: Int => T)(implicitm: ClassManifest[T]) = { val xs = new Array[T](len) for(i <- 0 until len) xs(i) = f(i) xs } // 簡化後 def tabulate[T: ClassManifest](len: Int, f: Int => T) = { val xs = new Array[T](len) for(i <- 0 until len) xs(i) = f(i) xs }
ClassTag
, 指定運行時的類型,如 Array[Int]
在運行時想指定爲 int[]ast
import scala.reflect._ def makePair[T : ClassTag](first: T, second: T) = { val r = new Array[T](2); r(0) = first; r(1) = second; r } makePair(4, 9) // 實際調用 makePair(4, 9)(classTag) // new 操做,即 ClassTag[Int] 構建原始類型數組 int[2] classTag.newArray
T >: Lower <: Upper
trait
,
T <: Comparable[T] with Serializable with Cloneable
T : Ordering : ClassTag
T =:= U
T <:< U
T => U
要添加該約束,需添加隱式參數
// 約束類 class Pair[T](val first: T, val second: T)(implicit ev: T <:< Comparable[T]) // 約束方法調用,只有類型知足才能調用成功,不然報錯 class Pair[T](val first: T, val second: T) { def smaller(implicit ev: T <:< Ordered[T]) = if (first < second) first else second } // 便於類型推斷 def firstLast[A, C <: Iterable[A]](it: C) = (it.head, it.last) // 沒法推斷類型 A firstLast(List(1, 2, 3)) // [Nothing, List[Int]] // 添加約束關係 def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last)