Налаштування короткого значення Java


114

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

При встановленні Longзначення я можу використовувати, setLongValue(100L)і воно працює. Отже, що Lтут означає і який характер для Shortцінності?

Дякую


L- це лише суфікс, який використовується для позначення longбукваря.
зниклий фактор

Відповіді:


174

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

Специфікація мови Java не забезпечує однаковий синтаксичний цукор для байтових чи коротких типів. Натомість ви можете оголосити це як таке, використовуючи явний кастинг:

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

У своєму setLongValue(100L)виклику методу не потрібно обов'язково включати Lсуфікс, оскільки в цьому випадку int literal автоматично розширюється до довгого. Це називається розширенням примітивного перетворення в специфікації мови Java.


16
Існують суфікси і для інших типів: d/ Dробить a doubleі f/ Fробить float!
Йоахім Зауер

6
Також: літерали, які вписуються в розмір, не потрібно додавати: два ваші приклади також працюють без літери.
Йоахім Зауер

Ви маєте рацію на обидва. Я мав би бути більш зрозумілим, що я говорю тут про цілі літерали, а не про літерали з плаваючою комою.
Лаурі

4
@Joachim: жоден ролик не потрібен лише для J5 +; На жаль, J2ME досі залишається на J4 (серйозно позбавлений J4).
Лоуренс Дол

2
@JoachimSauer, що означає "підходить до розміру"? Я прошу, тому що мені просто довелося спеціально подати заявку 0, (short)0щоб уникнути possible lossy conversion from int to shortпомилки, хоча 0 є коротким.
ryvantage

34

Не існує такого поняття, як байт або короткий буквал. Вам потрібно передати коротке використання(short)100


9

Як правило, ви можете просто передати змінну, щоб стати short.

Ви також можете отримати подібні проблеми, які можуть бентежити. Це відбувається тому, що +оператор просуває їх доint

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

Кастинг елементів не допоможе:

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

Вам потрібно віддати вираз:

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


1
Не забувайте, що є причина, чому короткий + короткий = int. Якщо сума двох шортів перевищує максимальну коротку величину машини, перекидання її на короткий призведе або до несподіваних результатів, або до винятку, якщо це підтримується jezikaje.
DGoiko

2
З цією логікою додавання двох інтів повернеться довго;)
матовий опік

1
І я шукаю це, якщо мої суми можуть перевищити Integer.MAX_VALUE. Я не захищаю рішення про повернення int (яке, ймовірно, пов'язане з тим, як HW насправді виконує суми), я просто кажу, що люди повинні підтвердити, що результат насправді заповнюється за короткий час, перш ніж вносити його туди. У мене виникло більше помилок із обмеженням короткої ємності, ніж обмеження int aswell, ймовірно, через розмір залучених чисел. 2 мініатюрні байта Java резервуари для короткої шапки дуже швидко
DGoiko

1
Я знову прочитав свій коментар, і я не прояснив свою думку. Перше речення заплутане, і я не повинен був цього говорити, а просто залишив решту, схоже, є два пов'язані з цим твердження. Причину короткого + короткого буття int можна прочитати тут: docs.oracle.com/javase/specs/ jvms / se8 / html /… , у JVM немає сумарних операцій для коротких. Інта Java - 32 біта, і коли це рішення було прийнято, більшість комп'ютерів були 32 біти, тож інт виглядав як найкраща ідея.
DGoiko

1
Також зауважте, що, як пояснено тут stackoverflow.com/a/27123302/9465588 , JVM насправді обслуговував щонайменше 32 біти свого віртуального простору пам’яті на поле класу, тому декларування коротких полів зовсім не економить пам’ять. Я не знаю, чи змінила Java це. Я, як правило, ніколи не використовую короткі значення, якщо тільки тере не стосується зовнішнього обмеження, як, наприклад, в DAO
DGoiko

8

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


PS: Ласкаво просимо до застряглої у середньовіччі болю від кодування J2ME. Не можу чекати, коли портативні пристрої зможуть зайняти 2000 робочих столів.
Лоуренс Дол

3
Немає "J4" (і немає "J5". Будь ласка, не робіть схему версій / імен Java більш заплутаною, ніж вона є.
Йоахім Зауер

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 та пізніших версіях. Java 1.0-1.4 завжди називається цим ім'ям Sun. І це робиться навмисно, тому що Sun використовував "Java 2" для позначення Java 1.2 до Java 1.5 / Java 5. Це дуже заплутано, але вигадування нових імен, які Sun ніколи не використовував, не полегшує.
Йоахім Зауер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.