39

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?

2
  • 2
    I don't actually claim to have found a bug. I just ask whether it could be a bug. And it's strange that in one part this type of expression works and in another it doesn't. Not very consistent in my eyes. Commented Mar 1, 2010 at 20:48
  • for the record, @JoachimSauer was referring to the section Don't rush to claim that you have found a bug. the up-to-date URL is catb.org/~esr/faqs/smart-questions.html#idp5122192 Commented Jul 8, 2013 at 13:21

4 Answers 4

70

This will work:

for (String crt : new String[]{"a","b","c"} ) {
    doSomething();
}
Sign up to request clarification or add additional context in comments.

Comments

22

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"}.

2 Comments

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

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);
}

Comments

4

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.