[英]Why can't I assign an instance with another type to a parameterized variable?
[英]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
從理論上講,因為String
是Object
的子類,所以可以對其進行擴展,以便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
類的子類。 由於arr1
是Object
項的數組,因此它可以接受任何內容,包括字符串和整數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.