Возможная ошибка в Eclipse Compiler для Java - PullRequest
0 голосов
/ 12 мая 2018

Прежде всего, я не уверен, и это не так, как «он должен компилироваться, но это не так и не наоборот; так что самое большее это будет раздражать кодера» .

    byte  b1 =  (byte) 1;
    Integer b2 = () 1;

Итак, первое - точное и бессмысленное приведение, и для иллюстрации,

для второго, есть две ошибки от компилятора:

  1. Синтаксисошибка в токене "(", ожидается байт после этого токена (это в первом '('
  2. Несоответствие типов: невозможно преобразовать из байта в целое число (из вторых скобок до значения)

Обсуждение:

Компилятор Eclipse предлагает тип байта, а не другой тип, может быть, байт наиболее похож на тип int, и это нормально. Второе, очевидно, неверно, '1' небайт, в то время как компилятор жалуется на это, как будто это так.

Так что для компилятора Eclipse второе утверждение выглядит так:

Integer b2 = (byte) 1;

Версия Eclipse: Oxygen.2 Release (4.7.2)

Eclipse Compiler для Java (TM) v20140604-1726, 3.10.0

1 Ответ

0 голосов
/ 13 мая 2018

Спецификация языка 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 ) помогает это исправить.

...