Ответ 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.