Причина, по которой компилятор жалуется, связана с этим ключевым моментом из раздела 14.21 спецификации языка Java , где обсуждаются недостижимые операторы:
За исключением специального режима из операторов
while
,do
иfor
, выражение условия которых имеет постоянное значениеtrue
, значения выражений не учитываются при анализе потока.
Обратите внимание, что if
не не одно из утверждений, которое имеет специальную обработку true
постоянных условий. Причина, по которой он исключен из этой специальной обработки, заключается в том, что он позволяет использовать if
в качестве формы условной компиляции, как объяснил Дейв Ньютон в своем ответе.
Поскольку у этого вопроса нет единственного правильного ответа, я не конечно, если это ' Будет лучше, чем ваш другой вопрос.
Я могу вспомнить три функции (в дополнение к общему стиранию, о котором вы уже упоминали), которые привели к компромиссу во имя обратной совместимости, - это новый синтаксис цикла, varargs и автобокс .
Новый синтаксис цикла for, вероятно, должен был читать для (элемента в списке)
, но для этого потребовалось бы преобразовать в
в зарезервированное слово. Это вызвало бы множество проблем обратной совместимости, не в последнюю очередь из-за того, что System.in
пришлось бы переименовать.
varargs и autoboxing добавили возможности двусмысленности. Например, если вы передаете массив объектов методу, принимающему Object ...
означает ли это, что массив должен передаваться как массив vararg или как элемент массива vararg? Это становится еще более сложным, если есть перегрузки. Автобокс имеет аналогичные проблемы неоднозначности с перегрузкой. Решение обеих этих проблем состояло в том, чтобы сделать правилом, что при разрешении вызовов методов они сначала разрешаются с правилами до 1.5 (то есть: без автобокса, и Object ...
обрабатывается как ] Объект []
). Только если вызов метода не может быть разрешен с помощью правил до версии 1.5, рассматриваются новые правила версии 1.5.
Объект ...
рассматривается как Объект []
). Только если вызов метода не может быть разрешен с помощью правил до версии 1.5, рассматриваются новые правила версии 1.5. и Объект ...
рассматривается как Объект []
). Только если вызов метода не может быть разрешен с помощью правил до версии 1.5, рассматриваются новые правила версии 1.5. В стандартной библиотеке
Еще один - это все классы и методы, которые уже устарели для нескольких версий, но просто не исчезнут. Наиболее примечательны различные методы Thread, которые устарели.