我們還是使用前面的 Queue 的例子,我們知道,我們不能使用+T(協(xié)變關(guān)系)來定義 Queue,然而,我們可以通過給 equeue 方法本身提供一個(gè)類型參數(shù)使之一般化。
class Queue[+T] ( private val leading: List[T],
private val trailing: List[T] {
def enqueue[U >: T ](x: U) =
new Queue[U](leading, x:: trailing)
}
在這個(gè)新定義中,使用了一個(gè)新的類型參數(shù) U, 語法結(jié)構(gòu) U >: T ,定義 T 為 U 的下界,因此U必須是 T 的一個(gè)父類。 enqueue 的返回類型也變成 Queue[U],而不是之前的 enqueue[T]。
舉例來說,比如說一個(gè) Fruit 類定義了兩個(gè)子類 Apple 和 Orange, 使用這個(gè)新的 enqueue 定義,可以把一個(gè) Orange 對(duì)象添加到一個(gè) Queue[Apple]隊(duì)列中,其返回結(jié)果為一 個(gè)Queue[Fruit]類型。