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