Java 泛型 (Generic) 的 Covariance, Contravariance, 以及 Invariance
Covariance,Contravariance,Invariance 把 A、B 想成類別,F 想成某種轉換,如 F(A) 表示把 A 轉換成其他形式, ≤ 符號表示子類別關係,如 A ≤ B 表示 A 是 B 的子類別。有這些後,可以簡單說明 Covariance、Contravariance 以及 Invariance 的意思: Covariance:A ≤ B 可以得出 F(A) ≤ F(B),則稱 F 具有 Covariance。 Contravariance:A ≤ B 可以得出 F(B) ≤ F(A),則稱 F 具有 Contravariance。 Invariance:F 既不是 Covariance 也不是 Contravariance 時,就稱 F 為 Invariance。 Java 中的 Covariance 假設我們定義了以下的類別:FujiApple ≤ Apple ≤ Fruit ≤ Food,Orange ≤ Fruit ≤ Food。稍微熟悉 Java 語法的人,很快就能了解 Java 的 Array 是 Covariance,也就是說 Apple[] 可以是 Fruit [] 。那我們能利用這樣的特性做什麼事呢? // 初始化一個 Apple array Apple[] apples = new Apple[10]; // Apple ≤ Food,所以這樣是可以的 Food[] foods = apples; // 從 Food array 取出 Food 本來就沒問題 Food f = foods[0]; // Oh my god !! Error foods[1] = new Orange(); 從上面的幾行程式碼我們可以看到,把 Apple array 指給 Food array 是沒問題的,因為 Apple 是一種 Food,同理取出 Food array 裡...