class Animal class Cat extends Animal class Cell[T](init: T) { def get = init }
以上面這段程式碼為例子。這是 invariance 的例子。他要求型別與實際物件型別兩者要一樣。如
var obj: Cell[Cat] = new Cell(new Cat)
如果是這樣的話
var obj: Cell[Animal] = new Cell(new Cat)
則會錯誤。因為左邊的型別與右邊物件的型別不一致。
那我們要如何表達類似"一隻貓屬於動物,一群貓屬於一群動物" 的概念呢?
為了讓這段程式碼 var obj: Cell[Animal] = new Cell(new Cat) 不會出錯
我們需要告訴編譯器 Cell 類別屬於 covariance。
因此我們需要把 Cell 類別程式碼改成這樣
class Animal class Cat extends Animal class Cell[+T](init: T) { def get = init }
covariance 是指 a 若是 b 的子類別,則 X[a] 是 X[b] 的子類別。
而 contravariance 是相反觀念。contravariance 指 a 若是 b 的子類別,則 X[b] 是 X[a] 的子類別。
如果要告訴編譯器Cell 類別屬於 contravariance。
則我們只需要把 Cell 類別程式碼改成這樣
class Animal class Cat extends Animal class Cell[-T](init: T) { def get = init }
沒有留言:
張貼留言