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

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

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

Спасибо


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


Ответы (4)


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

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

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

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

person Lauri    schedule 19.02.2010
comment
Есть суффиксы и для других типов: d/D образует double, а f/F образует float! - person Joachim Sauer; 19.02.2010
comment
Кроме того: литералы, которые соответствуют размеру, не нужно преобразовывать: ваши два примера работают и без приведения. - person Joachim Sauer; 19.02.2010
comment
Вы правы в обоих. Я должен был более четко указать, что я говорю здесь о целочисленных литералах, а не о литералах с плавающей запятой. - person Lauri; 19.02.2010
comment
@Joachim: Приведение не требуется только для J5+; J2ME, к сожалению, все еще находится на J4 (серьезно урезанном J4). - person Lawrence Dol; 20.02.2010
comment
@JoachimSauer, что значит вписаться в размер? Я спрашиваю, потому что мне просто нужно было специально указать 0 как (short)0, чтобы обойти ошибку possible lossy conversion from int to short, хотя 0 — это короткое замыкание. - person ryvantage; 27.10.2016
comment
@ryvantage Какая версия Java? - person Koray Tugay; 21.11.2016

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

person er4z0r    schedule 19.02.2010

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

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

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

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

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

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

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

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

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

person Lawrence Dol    schedule 19.02.2010
comment
PS: Добро пожаловать в застрявшую в средневековье боль кодирования для J2ME. Не могу дождаться, когда портативные устройства догонят настольные компьютеры 2000 года. - person Lawrence Dol; 19.02.2010
comment
Нет J4 (и нет J5. Пожалуйста, не делайте схему управления версиями/именования Java еще более запутанной, чем она уже есть. - person Joachim Sauer; 20.02.2010
comment
@Joachim: Java 1, Java 2, Java 5, Java 6 и Java 7 хорошо известны и называются так; нетрудно экстраполировать, что подразумевается под Java 3 и Java 4. Jn — это просто сокращение от очевидного. Принятие текущей (и, надеюсь, окончательной) номенклатуры Sun для всех версий уменьшает путаницу. - person Lawrence Dol; 20.02.2010
comment
Тогда, пожалуйста, скажите мне, какая именно версия Java 2? - person Joachim Sauer; 20.02.2010
comment
@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. Серьезно, это не так уж сложно понять. - person Lawrence Dol; 20.02.2010
comment
1. был только вырезан в Java 5 и более поздних версиях. Java 1.0-1.4 всегда упоминается Sun под этим именем. И это сделано преднамеренно, потому что Sun использовала Java 2 для обозначения Java 1.2 вплоть до Java 1.5/Java 5. Это очень запутывает, но изобретение новых имен, которые Sun никогда не использовала, не облегчает задачу. - person Joachim Sauer; 20.02.2010