- Covariance and contravariance (computer science)
- Many programming language type systems support subtyping. For instance, if the type Cat is a subtype of Animal, then an expression of type Cat should be substitutable wherever an expression of type Animal is used.
這篇文章的內容,對於編譯器開發者、
使用編譯器API的開發者,或
過度使用編譯器類型系統的開發者來說,
都是自然而然會遇到的內容。
並且,它自然地融入我們的編碼生活中。
簡單來說,如果有 Animal 和 Dog 兩種類型,
如果 Animal 可以被賦值 Dog,那就是共變性;
反之,如果 Dog 可以被賦值 Animal,那就是反共變性。
一般來說,Dog 無法被賦值 Animal。
因為從一般人的角度來看,這是不合理的,
所以編譯器開發者會考慮到這一點,只在某些部分使用反共變性。
通常,我們會在函數的輸入參數中使用反共變性,而在輸出參數中保持共變性。
為什麼需要反共變性?你可能會這麼想。
它有助於在事件處理等場景中,實現更靈活且保持多型性的操作。
而共變性反而可能會導致問題。
在上面的程式碼中,我們將 Animal 放入 Dog 的位置,以確保靈活性並考慮多型性。
如果使用 Dog 的子類型 Chiwawa 取代 Animal,在執行事件處理器時,由於 Dog 沒有 Chiwawa 專有的介面,可能會導致錯誤。
實際上,由於函數執行時使用的是 Animal 類型,所以可以認為它允許使用 Animal 的任何子類型。
這可能會讓人感覺像將 Dog 賦值給 Animal 一樣。
因此,反共變性通常用於函數的輸入參數。
協變性、不變性
簡單來說,協變性同時具有共變性和反共變性,而不變性則兩者皆無。
總結
這篇文章的內容,簡單易懂,但也可能相當複雜,
建議您親自閱讀一下。
评论0