Неявное сужение при суммировании констант и явное сужение при суммировании переменных
Я написал программу.
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 ответ:
Согласно разделу 5.2 JLS:
Сужение времени компиляции константных выражений означает, что такой код, как:
Байт theAnswer = 42; разрешается. Без сужения тот факт, что целочисленный литерал 42 имеет тип int, означал бы, что приведение к байту было бы обязательным:
Byte theAnswer = (byte)42; / / приведение разрешено, но не требуется
Постоянное выражение дополнительно определено в разделе 15.28 ПСБ.
Поскольку выражение
5+6
является постоянным выражением, которое помещается в диапазонbyte
, оно будет автоматически сужено во время компиляции без необходимости явного приведения. С другой стороны, поскольку выражениеc+6
не является постоянным выражением, оно не будет автоматически сужено и требуется явное приведение.