Спецификация языка Java® указывает, что является допустимым кодом Java, а что - недействительным кодом Java. В нем не указана формулировка ошибок компилятора .
Синтаксические ошибки обнаруживаются довольно рано во время компиляции после того, как поток символов был разбит на так называемые токены (например, (
, {
, byte
, имя переменной, ...). На основе этих токенов и правил грамматики компилятор пытается построить абстрактное синтаксическое дерево .
В вашем примере это невозможно при данных правилах. Проблема в том, что () 1
не является CastExpression
. Есть три правила для CastExpression
:
CastExpression:
( PrimitiveType ) UnaryExpression
( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus
( ReferenceType {AdditionalBound} ) LambdaExpression
1
может быть UnaryExpression
или UnaryExpressionNotPlusMinus
, но в скобках отсутствует либо PrimitiveType
, либо ReferenceType
. Если мы всегда применяем первое правило, мы получаем от PrimitiveType
через IntegralType
до токена byte
. Синтаксическое сообщение об ошибке содержит только первый ожидаемый следующий токен вместо перечисления всех возможных следующих токенов.
Integer b2 = (byte) 1;
синтаксически синтаксически, но не семантически правильно . В Eclipse Quick Fix ( Ctrl + 1 ) может рассказать вам, как изменить код, чтобы он также стал семантически правильным. В вашем примере первое предложение Quick Fix - Change cast to 'Integer'
.
Короче говоря, компилятор говорит, что не так, и Quick Fix ( Ctrl + 1 ) помогает это исправить.