Установка короткого значения Java

114

Я пишу небольшой код на J2ME. У меня есть класс с методом setTableId(Short tableId). Теперь, когда я пытаюсь написать, setTableId(100)это дает ошибку времени компиляции. Как я могу установить короткое значение без объявления другой короткой переменной?

При установке Longзначения могу использовать, setLongValue(100L)и оно работает. Итак, что Lздесь означает и что означает Shortзначение?

Спасибо

Mubashar
источник
Lэто просто суффикс, используемый для обозначения longлитерала.
missingfaktor

Ответы:

174

В Java целочисленные литералы по умолчанию имеют тип int. Для некоторых других типов, вы можете суффикс литерала регистронезависимых писем , как L, D, Fуказать длиной, двойной или поплавок, соответственно. Обратите внимание, что для удобства чтения обычно используются прописные буквы.

Спецификация языка Java не предоставляет такого же синтаксического сахара для байтовых или коротких типов. Вместо этого вы можете объявить его так, используя явное приведение:

byte foo = (byte)0;
short bar = (short)0;

В setLongValue(100L)вызове метода необязательно включать Lсуффикс, потому что в этом случае литерал int автоматически расширяется до long. В Спецификации языка Java это называется расширяющимся примитивным преобразованием.

Лаури
источник
16
Существуют также суффиксы для других типов: d/ Dделает a doubleи f/ Fделает float!
Иоахим Зауэр,
6
Также: литералы, которые вписываются в размер, не нуждаются в приведении: ваши два примера также работают без приведения.
Иоахим Зауэр,
Вы правы в обоих случаях. Я должен был быть более ясным, что я говорю здесь о целочисленных литералах, а не о литералах с плавающей запятой.
Lauri
4
@Joachim: Приведение не требуется только для J5 +; J2ME, к сожалению, все еще находится на уровне J4 (серьезно урезанный J4).
Лоуренс Дол
2
@JoachimSauer, что значит «вписаться в размер»? Я спрашиваю , потому что я просто должен был специально брошен , 0как (short)0обойти на possible lossy conversion from int to shortошибку, даже если 0 является коротким.
ryvantage
34

Байт или короткий литерал не существует. Вам нужно преобразовать в короткий, используя(short)100

er4z0r
источник
9

Как правило, вы можете просто преобразовать переменную в short.

Вы также можете столкнуться с подобными проблемами, которые могут сбивать с толку. Это потому, что +оператор повышает их доint

введите описание изображения здесь

Приведение элементов не поможет:

введите описание изображения здесь

Вам нужно привести выражение:

введите описание изображения здесь

Мэтт Бернс
источник
1
Не забывайте, что есть причина, по которой short + short = int. Если сумма двух коротких замыканий выше, чем максимальное короткое значение машины, приведение его к короткому приведет либо к неожиданным результатам, либо к исключению, если это поддерживается языком.
DGoiko
2
С этой логикой, добавив два Интс вернутся долго;)
матовое ожоги
1
И я ищу это, если мои суммы могут превышать Integer.MAX_VALUE. Я не защищаю решение о возврате int (что, вероятно, связано с тем, как HW фактически вычисляет суммы), я просто говорю, что люди должны подтвердить, что результат действительно заполняет короткое время, прежде чем помещать его туда. Я встречал больше ошибок, ограничивающих короткую емкость, чем ограничение int, вероятно, из-за размера задействованных чисел. 2 крошечных байта java-резерва для короткой крышки очень быстро
DGoiko
1
Я перечитал свой комментарий еще раз и не разъяснил свою точку зрения. Первое предложение сбивает с толку, и я должен был не говорить этого, а просто оставить все остальное, похоже, есть два связанных утверждения. Причину, по которой short + short является int, можно прочитать здесь: docs.oracle.com/javase/specs/ jvms / se8 / html /… , в JVM, для краткости, нет операций суммирования. Java int имеет 32 бита, и когда было принято это решение, большинство компьютеров были 32-битными, поэтому я думаю, что int выглядело как лучшая идея.
DGoiko
1
Также обратите внимание, что, как объясняется здесь stackoverflow.com/a/27123302/9465588 , JVM фактически выделил как минимум 32 бита своего пространства виртуальной памяти для каждого поля класса, поэтому объявление коротких полей вообще не экономит память. Я не знаю, изменила ли это Java. Я стараюсь никогда не использовать короткие значения, если только это не связано с внешним ограничением, как в DAO
DGoiko
8

Вы можете использовать setTableId((short)100). Я думаю, что это было изменено в Java 5, поэтому числовые литералы, присвоенные байтовому или короткому значению и находящиеся в пределах диапазона для цели, автоматически считаются целевым типом. Однако последние J2ME JVM являются производными от Java 4.

Лоуренс Дол
источник
PS: Добро пожаловать в застрявшую в средневековье боль программирования для J2ME. Не могу дождаться, когда портативные устройства догонят настольные компьютеры 2000 года.
Лоуренс Дол
3
Нет «J4» (и нет «J5». Пожалуйста, не делайте схему управления версиями / именами Java более запутанной, чем она уже есть.
Joachim Sauer
2
@Joachim: Java 1, Java 2, Java 5, Java 6 и Java 7 хорошо известны и упоминаются именно так; нетрудно экстраполировать, что подразумевается под Java 3 и Java 4. «Jn» - это просто сокращение очевидного. Принятие текущей (и, надеюсь, окончательной) номенклатуры Sun для всех версий уменьшает путаницу.
Лоуренс Дол
2
@Joachim: Согласно последнему слову Sun по этому поводу, первая цифра "1". Java «1.x» следует рассматривать, как если бы его никогда не было при обращении к обсуждаемым версиям, и он сохраняется в версии, создаваемой JVM, только для совместимости. Таким образом, Java 2 - это та версия, которая ранее была известна как 1.2, откуда изначально пришел J2SE (вы заметите, что в то же время Sun рекомендовала больше не использовать J2xE, а скорее JavaEE, JavaSE и JavaME). Отсюда следует, что 1.3 - это Java 3, 1.4 - Java 4, 1.5 - Java 5, 1.6 - Java 6 и 1.7 - Java 7. Серьезно, это не так уж и сложно понять.
Лоуренс Дол
2
«1». был вырезан только в Java 5 и более поздних версиях. Sun всегда называет Java 1.0-1.4 этим именем. И это сделано намеренно, потому что Sun использовала «Java 2» для обозначения Java 1.2 до Java 1.5 / Java 5. Это очень сбивает с толку, но изобретение новых имен, которые Sun никогда не использовала, не облегчает задачу.
Joachim Sauer