2017-01-21 10 views
2

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

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 

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

Прошу вас, если я концептуально ошибаюсь.

ответ

3

Согласно Section 5.2 из JLS:

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

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

byte theAnswer = (byte) 42; // литой разрешено, но не обязательно

Постоянное выражение далее определено в Section 15.28 JLS.

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