2010-03-01 11 views
31

Mientras intentaba algo especial en for loop, reconocí que a Java no parece gustarle poner una matriz anónima como origen de un for-each-loop:Java: matriz "anónima" en for-each-loop

for (String crt : {"a","b","c"}) { 
    doSomething(); 
} 

realidad no funciona mientras

String[] arr = {"a","b","c"}; 
for (String crt : arr) { 
    doSomething(); 
} 

hace.

Incluso fundir la matriz en String [] no ayuda. Al mover el cursor sobre la primera versión, eclipse me dice:

Type mismatch: cannot convert from String[] to String mientras que significa "crt".

¿Esto es un error?

+2

En relación con "¿Esto es un error?": Http://www.catb.org/~esr/faqs/smart-questions.html#id382249 –

+2

En realidad, no ** afirmo ** haber ** encontrado ** un insecto. Solo ** pregunto ** si ** podría ser ** un error. Y es extraño que en una parte este tipo de expresión funcione y en otra no. No muy consistente a mis ojos. – Atmocreations

+0

para el registro, @JoachimSauer se refería a la sección _No se apresure a reclamar que ha encontrado un error._ la URL actualizada es http://www.catb.org/~esr/faqs/smart -questions.html # idp5122192 –

Respuesta

60

Esto funcionará:

for (String crt : new String[]{"a","b","c"}) { 
    doSomething(); 
} 
3

No sé, ¿qué pasa con esto? :) Lástima que no hay una versión sucinta. Supongamos que usted podría utilizar Groovy o Scala si quería nada de eso :)

for (String s : Arrays.asList("a","b","c")) { 
    hmm(s); 
} 
+0

suena un poco como C#: P – Atmocreations

2

¿Quieres

for (String crt : new String [] {"a","b","c"}) { 
    doSomething(); 
} 

utilizo IntelliJ y dice que pone el mensaje "espera la expresión" en el lado derecho del colon en el for-loop, que parece más preciso.

Debo añadir que IntelliJ también ofrece agregar el "nuevo String []" automágicamente para mí.

18

El lenguaje Java proporciona el formulario {"a","b","c"} como un acceso directo, pero solo es posible durante la asignación. Es posible evitar las posibles ambigüedades durante el análisis, en algunas posiciones {} podría interpretarse como un bloque de código.

La manera correcta de hacerlo sería cómo sugiere Noah, con new String[]{"a","b","c"}.

+5

Tenga en cuenta que ese formulario corto no está permitido en todas las asignaciones. Está permitido solo en inicializaciones. –

+0

@Joachim: hecho interesante. Esto prácticamente soluciona mi pregunta, gracias por señalarlo. @Tom Castle: +1 Buena respuesta – Atmocreations