Автообоксинг / расширение происходит короче A = 3, но не в плавании A = 3;

StackOverflow https://stackoverflow.com/questions/3676629

  •  01-10-2019
  •  | 
  •  

Вопрос

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

Float a=3

Потому что это переведено как float a = integer.valueof (3). У нас будет ссылка на поплавок на LHS и целочисленное объект на RHS, который несовместимо. Но :

1.

     `Short a=3;`

Это работает, хотя здесь снова у нас будет краткосрочная ссылка на LHS и целочисленный объект на RHS.

2.

Float a=(Float) 3

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

Это было полезно?

Решение

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

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

Уведомление в вышеуказанном коде максимально возможные шестнадцатеричные значения для Char, Byte и короткой. Если вы превышаете это, компилятор автоматически состоит в том, чтобы включить значение INT и сообщить вам, что вам нужен сужение для назначения. Вы узнаете, что вы наступили через строку.

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

Во втором случае Float a=(Float) 3 станет Float.valueOf(3)

Другие советы

Если ваш вопрос: «Зачем плавать F = 3; не скомпилируется, но короткие S = 3; делает?», Тогда ответ:

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

Short s = 3;

скомпилирован

Short s = Short.valueOf(3);

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

short s = 3;

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

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

Float a=3.0f;

Для двойного типа:

Double b=3.0;

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

Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top