Рассмотрим следующий фрагмент кода, который я напутал после некоторого рефакторинга, когда проверил, почему сервер сборки сообщил о неисправной сборке, но в моей среде IDE было хорошо:
List<String> text;
...
for (String text : text) {...}
Итак, одно и то же имя используется для String и List внутри for-each.
Это, конечно, не очень мудро, но после того, как я перешел на мою ношу, чтобы переименовать его, я увидел, что выше код компилируется с JDK 8, но дает следующую ошибку с JDK 7:
error: for-each not applicable to expression type
for (String text : text) {
^
required: array or java.lang.Iterable
found: String
1 error
Я знаю, что изменения были внесены в несколько частей в этой области в JDK, но может кто-то просветить меня о том, почему именно это происходит?
Update: Поскольку у меня есть некоторые комментарии о поведении, здесь полный образец класса:
import java.util.Arrays;
import java.util.List;
public class Strange {
List<String> text = Arrays.asList("Max", "Alex", "Maria");
public static void main(String[] args) {
new Strange().doSomething("Alex");
}
public void doSomething(String name) {
for (String text : text) {
System.out.println(text.equals("Alex"));
}
}
}
И вот процесс компиляции и вывод (Windows 7 64bit):
C:\copy>c:\Projects\java\jdk1.7.0_79\bin\javac.exe Strange.java
Strange.java:13: error: for-each not applicable to expression type
for (String text : text) {
^
required: array or java.lang.Iterable
found: String
1 error
C:\copy>c:\Projects\java\jdk1.8.0_60\bin\javac.exe Strange.java
C:\copy>
Вывод: Я был так озадачен, почему моя IDE (которая использует 8) не жаловалась примерно на одно и то же имя в одном утверждении, но теперь ясно, что это не один оператор. Мне действительно интересно, почему этот момент так долго существовал, если JLS заявляет об обратном. Но в любом случае, спасибо за полученные мной идеи и отличные ответы (что затрудняло мне выбор лучшего).