在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中文網其他相關文章!