首頁  >  文章  >  Java  >  為什麼我們不能在 Java 中將泛型類型參數與「super」綁定?

為什麼我們不能在 Java 中將泛型類型參數與「super」綁定?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 10:42:29984瀏覽

Why Can't We Bound Generic Type Parameters with 'super' in Java?

用「super」綁定泛型:解釋

在Java 中使用泛型時,通常需要綁定類型參數以確保與特定類型的相容性。 'super' 關鍵字可用於指定類型參數必須是指定類型的超類別或超介面。但是,這種用法只能與通配符一起使用,不能與類型參數一起使用。

在 Collection 介面中,toArray 方法宣告為:

<T> T[] toArray(T[] a);

此方法可讓您轉換集合將「T」類型的元素轉換為相同類型的元素陣列。但是,你不能將方法寫成如下形式:

<T> <S super T> S[] toArray(S[] a);

這樣做的原因是泛型中的 'super' 關鍵字用於綁定通配符,而不是類型參數。在上面的範例中,您嘗試使用“super”將類型參數“S”綁定為“T”的超類別或超介面。不允許這種用法,因為它可能會導致類型安全性問題。

例如,請考慮以下程式碼:

List<Integer> integerList = new ArrayList<>();
Integer[] integerArray = new Integer[5];
Number[] numberArray = new Number[5];
Object[] objectArray = new Object[5];
// hypothetical method
integerList.toArray(super T numberArray)

根據您建議的語法,上述程式碼將允許以下類型分配:

integerList.toArray(super T integerArray)  // compiles fine!
integerList.toArray(super T numberArray)   // compiles fine!
integerList.toArray(super T objectArray)  // compiles fine!

但是,由於'String ' 不是'Integer' 的超類,因此以下程式碼不應編譯:

integerList.toArray(super T stringArray)  // should not compile

但是,由於'Object ' 是'Integer' 和'String' 的超類,以下程式碼仍然可以編譯,即使它會在運行時拋出'ArrayStoreException':

integerList.toArray(super T stringArray)  // compiles fine!

這種行為是不可取的,因為它可能會導致鍵入安全違規行為。為了防止這種情況,Java 不允許使用「super」來綁定類型參數。相反,您只能使用 'super' 來綁定通配符。

例如,您可以使用通配符重寫 toArray 方法,如下所示:

<T> T[] toArray(T[] a);

此方法允許您編寫程式碼這既是類型安全的又是靈活的。例如,以下程式碼編譯並且在運行時不會拋出“ArrayStoreException”:

List<Integer> integerList = new ArrayList<>();
Integer[] integerArray = new Integer[5];
Number[] numberArray = new Number[5];
Object[] objectArray = new Object[5];

integerList.toArray(objectArray);

以上是為什麼我們不能在 Java 中將泛型類型參數與「super」綁定?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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