2013-05-28 10 views
6

Per quanto posso dire, questo codice:Dovrei usare `new` con un array inizializzato in linea?

int[] numbers = new int[] { 1, 2 }; 

è lo stesso di questo codice:

int[] numbers = { 1, 2 }; 

In realtà, il compilato .class smonta sullo stesso codice:

1: newarray  int 
3: dup 
4: iconst_0 
5: iconst_1 
6: iastore 
7: dup 
8: iconst_1 
9: iconst_2 
10: iastore 
11: astore_1 
12: iconst_2 

Tuttavia, codice simile non sempre esegue allo stesso modo, o anche compilare. Ad esempio, si consideri:

for (int i : new int[] { 1, 2 }) { 
    System.out.print(i + " "); 
} 

Questo codice (in un metodo principale) compila e stampa 1 2. Tuttavia, la rimozione del new int[] per rendere la seguente:

for (int i : { 1, 2 }) { 
    System.out.print(i + " "); 
} 

genera più errori di compilazione, cominciando con

Test.java:3: error: illegal start of expression 
for (int i : {1, 2}) { 
      ^

presumo che la differenza tra questi due esempi è che nel primo esempio (con int[] numbers), il tipo int è esplicitamente indicato. Tuttavia, se questo è il caso, perché Java non può inferire il tipo di espressione dal tipo di i?

Ancora più importante, ci sono altri casi in cui le due sintassi differiscono, o dove è meglio usare l'una rispetto all'altra?

+0

@LuiggiMendoza Grazie per il link utile. Tuttavia, non sono sicuro che risponda completamente alla domanda: vale a dire, ci sono altri casi in cui le sintassi differiscono? – wchargin

+0

Controlla tutte le risposte, non solo quella superiore. –

+2

Suppongo che tu ti stia riferendo a [questo] (http://stackoverflow.com/a/16697404/732016) di erickson. Questa risposta lo spiega per i metodi, ma non per i cicli "for", dove il tipo è esplicitamente dichiarato e non vi è alcun rischio di circolarità. – wchargin

risposta

2

Da JLS #10.6. Array Initializers

Un inizializzatore matrice può essere specificata in una dichiarazione (§8.3, §9.3, §14.4), o come parte di un'espressione creazione matrice (§15.10), per creare una matrice e fornire alcuni valori iniziali.

Problemi correlati