型別引數
-
表現形式:在名稱后面以方括號表示,
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的子型別,即需要添加上邊界class Pair[T <: Comparable[T]](val first: T, val second: T) { def smaller = if (first.compareTo(second) < 0) first else second } -
下邊界
T >: LowerBound// 替換第一個元素 class Pair[T](val first: T, val second: T) { def replaceFirst(newFirst: T) = new Pair[T](newFirst, second) }替換第一個元素為 T 的父類 R,那么回傳型別是什么? 如果需要回傳 R,則需要添加約束,即需要下邊界;否則回傳的型別為 Any
// 回傳型別自動推斷為 new Pair[R] def replaceFirst[R >: T](newFirst: R) = new Pair(newFirst, second) -
背景關系邊界
T : ContextBoundScala 2.8 對
Array進行了更新優化,使用隱式轉換和 manifest 將陣列整合為 Scala 的集合庫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[]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) - 測驗是否相等
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1986.html
標籤:Scala
