Почему в Java нет байтов или коротких литералов?
Я могу создать буквальное число, добавив L к значению; почему я не могу создать буквальный короткий или байт каким-то другим способом? Почему мне нужно использовать int-литерал с литом?
И если ответ "Потому что в C не было короткого литерала", то почему в C? нет коротких литералов?
Это не влияет на мою жизнь каким-либо значимым образом; достаточно легко написать (короткий) 0 вместо 0S или что-то еще. Но непоследовательность вызывает у меня любопытство; это одна из тех вещей, которые беспокоят вас, когда вы поздно ночью. Кто-то в какой-то момент принял дизайнерское решение, позволяющее вводить литералы для некоторых примитивных типов, но не для всех из них. Почему?
Ответы
Ответ 1
В C, int
, по крайней мере, должен был быть "естественный" размер слова процессора, а long
, вероятно, должен был быть "большим натуральным" размером слова (не уверен в этой последней части, но он также объясняет, почему int
и long
имеют одинаковый размер на x86).
Теперь, я предполагаю, что для int
и long
существует естественное представление, которое точно соответствует машинным регистрам. Однако для большинства процессоров меньшие типы byte
и short
должны были быть дополнены до int
в любом случае перед использованием. Если это так, вы можете также сделать бросок.
Ответ 2
Я подозреваю, что это случай "ничего не добавляйте к языку, если он действительно не добавляет значения", - и это считалось добавлением достаточно небольшого значения, чтобы его не стоило. Как вы сказали, легко обойти, и, откровенно говоря, это редко необходимо в любом случае (только для устранения неоднозначности).
То же самое верно в С#, и я никогда особо не пропускал его ни на одном из языков. То, что я пропустил в Java, это байтовый тип без знака:)
Ответ 3
Другая причина может заключаться в том, что JVM не знает о коротком и байте. Все вычисления и хранение выполняются с помощью ints, longs, floats и double в JVM.
Ответ 4
Можно рассмотреть несколько вещей.
1) Как обсуждалось выше, JVM не имеет понятия байтов или коротких типов. Обычно эти типы не используются при вычислении на уровне JVM; поэтому можно подумать, что использование этих литералов будет меньше.
2) Для инициализации байтов и коротких переменных, если int-выражение является постоянным и в разрешенном диапазоне этого типа оно неявно приводится к типу-мишени.
3) Можно всегда использовать литерал, ex (короткий) 10