2013-09-05 56 views
1

數組創建是否在編譯時發生?創建數組編譯時間?

List<String>[] strings = new List[9]; 

它即使列表只是一個接口,所以我猜數組創建發生在鍵入消除之前。 這就是爲什麼下面不工作:

List<String>[] strings = new List<String>[9]; 

它是由於該陣列本身的創作發生之前的類型擦除權的事實呢?

+0

啊,這是完全合法的。它創建一個數組,沒有實際的'List'對象。 –

+0

在編譯時創建的唯一東西是字節碼。 –

+0

[[This Answer](http://stackoverflow.com/a/18581313/1393766)]可能會有所幫助。無論如何,爲實現多種List的對象創建數組有什麼問題? '新列表 [9]'不會工作,因爲這是不安全的類型,因爲你不會創建'新列表 [9]'但是(因爲類型擦除)'新列表[9]',所以你將能夠添加到它即使'ArrayList '如我在前面給出的鏈接中所述。所以不行,在編譯時創建數組並不負責這種行爲 - 並且在Java中不可能。 – Pshemo

回答

6

數組是在運行時創建的,類型擦除後。 newarray字節碼指令保留用於創建數組。

由於Java中的數組只包含對象引用,而不包含具體對象,因此可以創建接口和抽象類的數組。沒有實例被創建來填充數組。

至於爲什麼你不能創建參數化類型的數組,原因是數組不是類型安全的,as explained in the tutorial

+0

爲什麼它是合法的,然後'列表 [] strings = new List [9];'?在這種情況下爲什麼要合法地將參數的左邊位進行參數化? – Rollerball

+1

如果它是非法的,它將不可能實現某些程序,所以編譯器會讓你關閉併發出警告。 – Joni

0

不,數組在運行時創建。第一個代碼片段的工作原理與List<String> strings = new ArrayList()一樣 - 爲了向後兼容,raw類型是合法的,僅僅是不鼓勵。第二個不起作用,因爲很好,陣列和泛型混合不好。你可以把整個故事here

0

根據JLS -

在Java編程語言中,數組(第4.3.1節),是 動態創建的對象,並且可以被分配給類型的變量對象 (§4.3.2)。

ArrayCreationExpression

new PrimitiveType DimExprs Dimsopt 
new ClassOrInterfaceType DimExprs Dimsopt 
new PrimitiveType Dims ArrayInitializer 
new ClassOrInterfaceType Dims ArrayInitializer