Java: float, длинная локальная инициализация

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

E.g.

float f = 10;
long l = 5;

И что правильный способ написать вышеизложенное будет

float f = 10f;
long l = 5l;

Тем не менее, прямо сейчас я обнаруживаю, что компилятор успешно компилируется без заявлений об отказе от ответственности f и l. Я что-то упускаю?


person Stumbler    schedule 07.04.2014    source источник
comment
Автоматическое расширение. 10 — это целое число, преобразованное в число с плавающей запятой. Аналогично для 5.   -  person anonymous    schedule 07.04.2014
comment
На этот вопрос теперь дан ответ (задержка с принятием)   -  person Stumbler    schedule 07.04.2014


Ответы (3)


Это прекрасно работает, потому что вы неявно выполняете расширяющее примитивное преобразование с int на float и long соответственно.

Однако это не скомпилируется, и вам нужно будет добавить f или L, чтобы заставить его работать:

float f = 1.0; //can't convert from double to float
long l = 12345678912; //12345678912 is not a valid int
person assylias    schedule 07.04.2014

Давайте взглянем на отношение «вписывается в» в Java (только интересующие нас типы). График выглядит так

                  double
                  /   \
               float  long
                  \   /
                 integer

Итак, в вашем случае целые числа 10 и 5 подходят как к float, так и к double, поэтому неявное преобразование делает свое дело и код компилируется нормально. Однако 10L относится к типу long, который не вписывается в int. То же самое с 2.0, это double, который не может быть назначен float без явного приведения.

person Danstahr    schedule 07.04.2014

Если написанный вами целочисленный литерал можно преобразовать в целевой тип данных, это будет сделано неявно.

person ifloop    schedule 07.04.2014