簡體   English   中英

為什么將一種類型的數組存儲在另一種類型的變量中?

[英]Why can I store an array of one type in a variable of another type?

Object[] arr1 = new String[]{"0"};
CharSequence[] arr2 = new String[]{"0"};
arr1[0] = 0; // compiles; causes exception at runtime

使用泛型,您不能:

// java.util.ArrayList<CharSequence> list1 = new java.util.ArrayList<String>(); won't compile

從理論上講,因為StringObject的子類,所以可以對其進行擴展,以便String[]可以是Object[]的子類。

到Java 5出現並且正在設計泛型時,他們發現這是個壞主意,並努力防止在泛型中使用它。

泛型和數組:不相同的規則。

數組不能泛型收集。
這意味着在運行時,JVM將已編譯的List<String>視為List實例,而JVM會將已編譯的String[]視為String實例數組。

在編譯時,編譯器允許將類型的數組分配給使用其超類型聲明的數組變量。
之所以允許這樣做,是因為可以在運行時執行存儲在數組中的元素的有效性檢查:

Number[] numberArray = {1, 5F};
Integer[] integerArray = {1};
numberArray = integerArray; // compile fine
numberArray[0] = 5;  // fine at runtime as valid type
numberArray[0] = 5F; // exception at runtime as Integer[] should not store Float.

但是由於擦除,不可能在運行時使用泛型執行相同的檢查。

因此,JLS在編譯時對泛型有更多的限制。
因此, Arrays是協變的,而泛型集合是不變的。

Java中的每個類都是Object類的子類。 由於arr1Object項的數組,因此它可以接受任何內容,包括字符串和整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM