Какова функциональная разница между этими двумя утверждениями?
В этом примере функциональных отличий нет. В этом примере конечный результат один и тот же.
С лингвистической (Java) точки зрения это два разных случая:
short b = (short) 34;
Число 34
является int
буквальный. (short)
- это приведение типа, которое выполняет явное сужающее примитивное преобразование . Это обрезает значение, если это необходимо, хотя в этом нет необходимости. Затем у вас есть значение short
, которое присваивается переменной без дальнейшего преобразования.
short b = 34;
Число 34
является литералом int
. В этом случае происходит неявное сужающее примитивное преобразование . Этот «особый случай» происходит в контексте присваивания, когда:
- вычисляемое выражение является временем компиляции константное выражение , И *
- тип переменнойis
byte
, char
или short
, AND - значение выражения представимо в типе переменной.
Это НЕ будет усекать значение.
Если вы измените код на следующий, то разница между двумя контекстами станет очевидной:
short a = 100000; // Compilation error because 100,000 is too large
short b = (short) 100000; // OK - 100,000 is truncated to give -31,072
В качестве альтернативы:
int x = 34;
short y = x; // Compilation error because 'x' is NOT
// a constant expression
Наиболее релевантными разделами JLS являются 5.2 Контексты присвоения и 5.4 Контексты приведения .