首頁  >  文章  >  Java  >  為什麼 Java 泛型中的「super」關鍵字僅限於通配符而不是型別參數?

為什麼 Java 泛型中的「super」關鍵字僅限於通配符而不是型別參數?

Barbara Streisand
Barbara Streisand原創
2024-11-02 07:20:02684瀏覽

Why is the `super` keyword restricted to wildcards and not type parameters in Java generics?

泛型與'super' 關鍵字綁定

有人可能想知道為什麼super 關鍵字只適用於通配符,而不適用於Java 泛型中的型別參數。考慮 Collection 介面中的以下範例,其中 toArray 方法不是這樣聲明的:

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}

此語法將導致非法聲明,要理解其原因,需要探索將 super 與命名一起使用的含義類型參數。

類型參數中 'super' 的限制

使用 super 綁定命名型參數 () 將無法實現預期的效果。由於 Object 是所有引用類型的最終超類,因此任何引用類型數組都可以轉換為 Object[]。這意味著即使使用假設的語法,以下程式碼仍然會編譯並在運行時導致ArrayStoreException:

List<Integer> integerList;
integerList.toArray(new String[0]);  // should be disallowed, but compiles

因此,不允許使用super 與命名類型參數,以防止無法強制執行的錯覺

泛型和陣列:複雜的關係

另一個需要考慮的方面是泛型和陣列之間的複雜交互作用。在 Java 中,陣列的處理方式與其他集合類型不同,導致在強制類型安全性方面受到限制。這解釋了為什麼泛型類型邊界無法阻止給定範例中的 ArrayStoreException。

使用'super' 進行非法邊界的範例

為了進一步說明該問題,請考慮一種假設方法聲明:

<T super Integer> void add(T number)  // hypothetical! currently illegal

使用此語法,人們可能期望它接受Integer 和Number 實例,但不接受String。然而,由於 String 是 Object 的子類,而 Object 是 Integer 的超類,因此 add(aString) 仍然有可能編譯,導致潛在的錯誤。

結論

總之,使用具有命名類型參數的 super 受到限制,以確保類型安全並防止無效假設。 Java 中的泛型和陣列具有獨特的特徵,這些特徵限制了使用 super 綁定類型參數的有效性。

以上是為什麼 Java 泛型中的「super」關鍵字僅限於通配符而不是型別參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn