泛型與'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中文網其他相關文章!