Неоднозначная концепция конвертации в Java - PullRequest
1 голос
/ 30 октября 2019

Я действительно нахожу концепцию преобразования запутывающей.

short a = 34;
short b = (short)34;

В чем лингвистическая разница между этими двумя утверждениями? Я думаю, что в первом утверждении литерал int 34 непосредственно сохраняется в короткой переменной a, вызывая преобразование литерала int 34 в короткий литерал 34. А во втором, кажется, что литерал int 34 сначала преобразуется вкороткий литерал 34 из-за инструкции приведения и затем сохраняется в короткой переменной b. Я прав или это один из двух случаев?

1 Ответ

1 голос
/ 30 октября 2019

Какова функциональная разница между этими двумя утверждениями?

В этом примере функциональных отличий нет. В этом примере конечный результат один и тот же.

С лингвистической (Java) точки зрения это два разных случая:

short b = (short) 34;

Число 34 является intбуквальный. (short) - это приведение типа, которое выполняет явное сужающее примитивное преобразование . Это обрезает значение, если это необходимо, хотя в этом нет необходимости. Затем у вас есть значение short, которое присваивается переменной без дальнейшего преобразования.

short b = 34;

Число 34 является литералом int. В этом случае происходит неявное сужающее примитивное преобразование . Этот «особый случай» происходит в контексте присваивания, когда:

  1. вычисляемое выражение является временем компиляции константное выражение , И *
  2. тип переменнойis byte, char или short, AND
  3. значение выражения представимо в типе переменной.

Это НЕ будет усекать значение.


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

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 Контексты приведения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...