Java:for-each循环中的“匿名”数组

38

当我尝试在for循环中使用一个特殊的匿名数组作为for-each-loop的源时,我发现Java好像不喜欢这样做:

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

实际上在某种情况下无法工作

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

即使将数组强制转换为String[]也没有用。当在第一个版本上移动光标时,eclipse会提示:

Type mismatch: cannot convert from String[] to String 而意思是“crt”。

这是一个bug吗?


2
我并不真正声称已经发现了一个错误。我只是询问它是否可能是一个错误。而且奇怪的是,在某个部分,这种类型的表达式可以工作,而在另一个部分却不能。在我看来,这并不是很一致。 - Atmocreations
仅供记录,@JoachimSauer 是在提到章节“不要急于声称你发现了一个 bug”。最新的 URL 是 http://www.catb.org/~esr/faqs/smart-questions.html#idp5122192。 - törzsmókus
4个回答

68
这将起作用:
for (String crt : new String[]{"a","b","c"} ) {
    doSomething();
}

22
Java语言提供了{"a","b","c"}形式作为一种快捷方式,但只能在赋值过程中使用。可能是为了避免在解析过程中出现可能的歧义,因为在某些位置上{}可能会被解释为代码块。
正确的方法是像Noah建议的那样使用new String[]{"a","b","c"}

5
请注意,在所有的任务中都不允许使用该缩写。它只允许在初始化时使用。 - Joachim Sauer
@Joachim:有趣的事实。这基本上解决了我的问题,感谢你指出来。 @Tom Castle:+1 好答案。 - Atmocreations

4

不知道,这个怎么样?:) 遗憾的是没有简洁版。如果您需要类似的东西,可以使用Groovy或Scala :)

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

4

You want

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

我使用IntelliJ,它提示我在for循环的冒号右侧放置“expression expected”的消息,这似乎更准确。

我应该补充说明,IntelliJ也可以自动为我添加“new String []”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接