views:

247

answers:

4

Hello

While I was trying something special in for loop I recognized that Java doesn't seem to like putting an anonymous array right as the source for a for-each-loop:

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

actually doesn't work while

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

does.

Even casting the array to String[] doesn't help. When moving the cursor over the first version, eclipse tells me:

Type mismatch: cannot convert from String[] to String while meaning "crt".

Is this a bug?

+14  A: 

This will work:

for (String crt : new String[]{"a","b","c"} ) {
    doSomething();
}
noah
Accept: Shortest answer which provides a correct solution. Thanks!
Atmocreations
+1  A: 

Dunno, what about this? :) Pity there's no succinct version. Suppose you could use Groovy or Scala if you wanted anything like that :)

for (String s : Arrays.asList("a","b","c")) {
    hmm(s);
}
Chris Dennett
sounds a bit like C# :P
Atmocreations
+1  A: 

You want

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

I use IntelliJ and it says put the message "expression expected" on the right-hand side of the colon in the for-loop, which seems more accurate.

I should add that IntelliJ also offers to add the "new String []" automagically for me.

dbrown0708
+6  A: 

The Java language provides the {"a","b","c"} form as a shortcut, but it is only possible during assignment. It's possible this is to avoid possible ambiguities during parsing, in some positions {} could be interpreted as a code block.

The right way to do it would be how noah suggests, with new String[]{"a","b","c"}.

Tom Castle
Please note that that short form isn't allowed in all assignments. It is allowed only in initializations.
Joachim Sauer
@Joachim: interesting fact. This pretty much solves my question, thanks for pointing it out.@Tom Castle: +1 Good answer
Atmocreations