數組創建是否在編譯時發生?創建數組編譯時間?
List<String>[] strings = new List[9];
它即使列表只是一個接口,所以我猜數組創建發生在鍵入消除之前。 這就是爲什麼下面不工作:
List<String>[] strings = new List<String>[9];
它是由於該陣列本身的創作發生之前的類型擦除權的事實呢?
數組創建是否在編譯時發生?創建數組編譯時間?
List<String>[] strings = new List[9];
它即使列表只是一個接口,所以我猜數組創建發生在鍵入消除之前。 這就是爲什麼下面不工作:
List<String>[] strings = new List<String>[9];
它是由於該陣列本身的創作發生之前的類型擦除權的事實呢?
數組是在運行時創建的,類型擦除後。 newarray
字節碼指令保留用於創建數組。
由於Java中的數組只包含對象引用,而不包含具體對象,因此可以創建接口和抽象類的數組。沒有實例被創建來填充數組。
至於爲什麼你不能創建參數化類型的數組,原因是數組不是類型安全的,as explained in the tutorial。
爲什麼它是合法的,然後'列表
如果它是非法的,它將不可能實現某些程序,所以編譯器會讓你關閉併發出警告。 – Joni
數組創建於運行時。您只是創建一個包含List<String>
的數組,並且沒有創建List<String>
的實際對象。所以它是完全有效的。
Run-time Evaluation of Array Creation Expressions JLS在運行時間處評估陣列創建表達式。
不,數組在運行時創建。第一個代碼片段的工作原理與List<String> strings = new ArrayList()
一樣 - 爲了向後兼容,raw類型是合法的,僅僅是不鼓勵。第二個不起作用,因爲很好,陣列和泛型混合不好。你可以把整個故事here
根據JLS -
在Java編程語言中,數組(第4.3.1節),是 動態創建的對象,並且可以被分配給類型的變量對象 (§4.3.2)。
new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer
new ClassOrInterfaceType Dims ArrayInitializer
啊,這是完全合法的。它創建一個數組,沒有實際的'List'對象。 –
在編譯時創建的唯一東西是字節碼。 –
[[This Answer](http://stackoverflow.com/a/18581313/1393766)]可能會有所幫助。無論如何,爲實現多種List的對象創建數組有什麼問題? '新列表 [9]'不會工作,因爲這是不安全的類型,因爲你不會創建'新列表 [9]'但是(因爲類型擦除)'新列表[9]',所以你將能夠添加到它即使'ArrayList '如我在前面給出的鏈接中所述。所以不行,在編譯時創建數組並不負責這種行爲 - 並且在Java中不可能。 –
Pshemo