Ответ 1
Это соответствующие разделы JLS:
JLS 5.1.1 Преобразование идентичности
Для любого типа допускается преобразование из типа в тот же тип.
JLS 5.2 Преобразование присваивания
Преобразование присваивания происходит, когда значение выражения присваивается переменной: тип выражения должен быть преобразован в тип переменной. Контексты присваивания позволяют использовать одно из следующего:
- Преобразование удостоверений
- [...]
Кроме того, если выражение является константным выражением типа
byte
,short
,char
илиint
:
- Сужение примитивного преобразования может быть использовано, если тип переменной
byte
,short
илиchar
, а значение константного выражения представляется в типе переменной.
Вышеупомянутые правила объясняют все следующее:
short a = 4; // representable constant
short b = 5; // representable constant
short c = 5 + 4; // representable constant
short d = a; // identity conversion
short e = a + b; // DOES NOT COMPILE! Result of addition is int
short z = 32767; // representable constant
short z_ = 32768; // DOES NOT COMPILE! Unrepresentable constant
Как это не компилируется:
test(7); // DOES NOT COMPILE! There no test(int) method!
Это потому, что сужение преобразования с константой определяется только для присвоений; а не для вызова метода, который имеет совершенно разные правила.
JLS 5.3. Конверсия вызова метода
Преобразования вызова метода конкретно не включают неявное сужение целочисленных констант, которое является частью преобразования присваивания. Дизайнеры языка программирования Java считали, что включение этих неявных сужений в конверсии добавит дополнительную сложность перегруженному методу, соответствующему процессу разрешения.
Вместо того, чтобы объяснять, как работает разрешение метода, я просто укажу на Эффективное Java 2nd Edition, пункт 41: разумно используйте перегрузку:
Правила, определяющие, какая перегрузка выбрана, чрезвычайно сложны. Они занимают тридцать три страницы в спецификации языка, и лишь немногие программисты понимают все их тонкости.
См. также
- Изменчивое поведение для возможной потери точности
-
short x = 3; x += 4.6;
компилируется из-за семантики составного назначения
-