2014年2月22日 星期六

scala 中的 Covariance 與 Contravariance

invariance、covariance、contravariance 這三者都是 generic types 的觀念。




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
}


操考資料:

沒有留言:

張貼留言