以下類型其實(shí)不表示值的集合,也其實(shí)不顯式地出現(xiàn)在程序中。它們只以已定義標(biāo)識符的內(nèi)部類型而引入。
方法類型
方法類型在內(nèi)部表示為(Ts)U,(Ts)是1個(gè)類型序列(T1,...,Tn) n>=0,U是1個(gè)(值或方法)類型。這個(gè)類型表示1個(gè)命名的方法,其參數(shù)的類型是T1,...,Tn,返回結(jié)果的類型是U。
方法類型是右結(jié)合的,(Ts1)(Ts2)U被處理的方式是(Ts1)((Ts2)U)。
1個(gè)特例是沒有參數(shù)的方法類型。可以寫為=>T的情勢。無參數(shù)方法名稱表達(dá)式將會在每次名稱被援用時(shí)求值。
方法類型其實(shí)不以值的類型的情勢存在。如果方法名以值的方式被援用,其類型將會被自動轉(zhuǎn)換為對應(yīng)的函數(shù)類型(§6.25)。
示例3.3.1 以下聲明:
def a: Int
def b (x: Int): Boolean
def c (x: Int)(y: String, z:String): String
產(chǎn)生以下類型:
a: => Int
b: (Int) Boolean
c: (Int)(String, String) String
多態(tài)方法類型
多態(tài)方法類型在內(nèi)部表示為[tps]T,[tps]是類型參數(shù)部份[a1 >: L1 <: U1,...,an >: Ln <: Un],n>=0,T是1個(gè)(值或方法)類型。該類型表示1個(gè)以S1,...,Sn為類型參量并產(chǎn)生類型為T的結(jié)果的命名方法,參數(shù)類型S1,...,Sn與下界L1,...,Ln和上界U1,...,Un1致(§3.2.4)。
示例3.3.2 以下聲明:
def empty[A]: List[A]
def union[A <:Comparable[A]] (x: Set[A], xs: Set[A]): Set[A]
產(chǎn)生以下類型:
empty: [A >: Nothing <: Any] List[A]
union: [A >: Nothing <: Comparable[A]] (x: Set[A], xs:Set[A]) Set[A]
類型構(gòu)造器
類型構(gòu)造器在內(nèi)部的表示方法類似于多態(tài)方法類型。[+/- a1 >: L1 <: U1,...,+/-an >: Ln <: Un] T表示1個(gè)期望是類型構(gòu)造器參數(shù)(§4.4)或有對應(yīng)類型參數(shù)子句的抽象類型構(gòu)造器綁定(§4.3)的類型。
示例3.3.3 以下是類Iterable[+X]的片斷:
trait Iterable[+X]{
def flatMap[newType[+X]<:Iterabe[X],S](f: X => newType[S]): newType[S]
}
從概念上來說,類型構(gòu)造器Iterable是匿名類型[+X] Iterable[X]的名稱,在
flatMap中傳遞給newType類型構(gòu)造器參數(shù)。