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