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