can't doubles be floats as well?
Нет. Каждое значение или переменная имеет ровно один тип (double, float, int, long и т. Д.). Спецификация языка Java точно определяет, что происходит, когда вы пытаетесь присвоить значение одного типа переменной другого типа. Как правило, присваивания «меньшего» значения «большему» типу допускаются и выполняются неявно, но присваивания, в которых информация может быть потеряна, поскольку целевой тип слишком «мал», чтобы содержать все значения исходного типа, не допускаются компилятор, даже если конкретное значение вписывается в целевой тип.
Вот почему компилятор жалуется на то, что присвоение двойного значения (которое является неявным литералом) переменной с плавающей запятой может привести к потере информации, и вы должны успокоить ее, либо сделав значение плавающим, либо явным приведением.
Одна область, которая часто вызывает путаницу, - это вычисления, потому что они неявно «расширены» до int по техническим причинам. Таким образом, если вы умножите два коротких и попытаетесь присвоить результат короткому, компилятор будет жаловаться, потому что результатом вычисления является int.