Java: почему я не могу использовать int для Long

Все числа в java должны быть типа int. Следующая строка является законной в Java > 1.5

Short s = 1; // Will compile to Short s = Short.valueOf((short)1) - thus you can't exceed short max value i.e.
Short s =  4444; // is invalid for autoboxing

Те же механики идут для создания Integer и Byte. Но Long работает совершенно иначе. Следующий код дает ошибку времени компиляции

Long l = 10;

Long использует такой же подход для автобоксинга длинных типов, поэтому

Long l = 10L; //is valid and is translated into Long.valueOf(10L)

Я не понимаю, почему int нельзя назначить переменной Long. Любые мысли по этому вопросу?

Ответ 1

Я думаю, что речь шла не о приведении примитивов и оберток вообще. Вопрос был о различии между литьем int в java.lang.Long и int в java.lang.Short, например.

JLS: "Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int:

  • Сужение примитивного преобразования может быть использовано, если тип переменной является байтом, коротким или char, а значение константного выражения представляется в типе переменной.
  • Сужение примитивного преобразования, за которым следует преобразование бокса, может быть использовано, если тип переменной:
    • Байт и значение константного выражения представляются в байте типа.
    • Короткое значение, а значение константного выражения представляется в типе short.
    • Символ и значение константного выражения представляются в типе char ".

Таким образом, все <= 32-разрядные примитивы могут быть легко отлиты и длинные (64 бит) требуют специального литья. Это кажется нелогичным.

Все нелогичные вещи, как обычно, имеют объяснение в обратной совместимости или исторической эволюции в java. Например. классы Integer и Long существуют в java начиная с версии 1.0. Классы Short и Byte существуют в java начиная с версии 1.1. То есть в начальной точке целое число может быть двух типов: целое или длинное. Поэтому я считаю, что для этих двух типов чисел существуют разные правила кастинга. А затем добавлены короткие и байт. Я предполагаю, что короткие и байты могут иметь 32-битную реализацию в конкретных JVM.

Ответ 2

Поскольку Long с первой заглавной буквой является классом-оболочкой, а не примитивным типом.

Посмотрите здесь.

Ответ 3

Вы можете отбрасывать int до long и long до long
но вы не можете использовать int для long

правильно написать Long l = (long) 10;