Автобокс / расширение происходит в Short a = 3, но не в Float a = 3; - PullRequest
5 голосов
/ 09 сентября 2010

Я понимаю, что следующий код не будет работать

Float a=3

, потому что он переведен как Float a = Integer.valueOf (3).У нас будет ссылка Float на LHS и объект Integer на RHS, что несовместимо.Но:

1.

     `Short a=3;`

Это работает, хотя и здесь у нас будет Краткая ссылка на LHS и объект Integer на RHS.2.

Float a=(Float) 3

Если бы мы не набрали тип 3, он был бы переведен как Integer.valueOf (3).Теперь он будет переведен как Float.valueOf (3)?

Ответы [ 4 ]

2 голосов
/ 12 сентября 2010

Если ваш вопрос «Почему Float f = 3; не компилируется, а Short s = 3; делает?», То ответ:

компилятор Java выполняет некоторую специальную работу с целочисленными константами, чтобы поместить их в левую часть: он находит наиболее подходящий тип и использует его. Итак,

Short s = 3;

компилируется в

Short s = Short.valueOf(3);

По сути, та же магия происходит, когда вы пишете

short s = 3;

Но это делается только для целых чисел, а не для значений с плавающей запятой.

1 голос
/ 09 сентября 2010

Краткая форма:

Float a=3.0f;

Для типа Double:

Double b=3.0;
0 голосов
/ 18 сентября 2010

Нет способа указать короткие и байтовые константы, поэтому компилятор позволяет прозрачно переводить int-константы.В Java есть константы с плавающей точкой, поэтому она не поддерживает подразумеваемый перевод.Если вы хотите использовать float / Float, я предлагаю вам использовать константу с плавающей точкой.

Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;
0 голосов
/ 17 сентября 2010

Если вы попытаетесь инициализировать переменную значением, превышающим ее значение (независимо от числовой формы значения), компилятор выдаст вам сообщение об ошибке.

char c = 0xffff; // max char hex value
byte b = 0x7f; // max byte hex value
short s = 0x7fff; // max short hex value

Обратите внимание на приведенный выше код максимально возможных шестнадцатеричных значений для char, byte и short.Если вы превысите их, компилятор автоматически сделает значение int и скажет вам, что вам нужно сужающее приведение для назначения.Вы будете знать, что переступили черту.

Так что в вашем случае Short s = 3 фактически становится Short s = new Short(3) и работает.(Методы valueOf не используются при автобоксировании, поэтому современные IDE имеют опции, чтобы пометить эти автобокс как ошибки, и мы можем заменить их методом valueOf для лучшего мгновения памяти)стать Float.valueOf(3)

...