Неявное сужение при суммировании констант и явное сужение при суммировании переменных


Я написал программу.

class First
{
        public static void main(String[] args)
        {
                int c = 5;
                byte b = c+6;
                System.out.println(b);
        }
}

И мой вывод javac:

error: incompatible types: possible lossy conversion from int to byte
        byte b = c+6;
                  ^
1 error

Но если я изменю программу следующим образом:

class First
{
        public static void main(String[] args)
        {
                byte b = 5+6;
                System.out.println(b);
        }
}

Он работает нормально, вывод:

11

Я знаю, что перед операцией оба операнда преобразуются в целое число. Тогда оператор + приводит к целому числу. Но если переменная c была целым числом, то константа 5 также является целым числом по умолчанию. Почему javac не приводит к ошибке во втором случае?

Пожалуйста, направьте меня, если я концептуально неправильный.

1 2

1 ответ:

Согласно разделу 5.2 JLS:

Сужение времени компиляции константных выражений означает, что такой код, как:

Байт theAnswer = 42; разрешается. Без сужения тот факт, что целочисленный литерал 42 имеет тип int, означал бы, что приведение к байту было бы обязательным:

Byte theAnswer = (byte)42; / / приведение разрешено, но не требуется

Постоянное выражение дополнительно определено в разделе 15.28 ПСБ.

Поскольку выражение 5+6 является постоянным выражением, которое помещается в диапазон byte, оно будет автоматически сужено во время компиляции без необходимости явного приведения. С другой стороны, поскольку выражение c+6 не является постоянным выражением, оно не будет автоматически сужено и требуется явное приведение.