Impostazione del valore breve Java


114

Sto scrivendo un piccolo codice in J2ME. Ho una classe con un metodo setTableId(Short tableId). Ora quando provo a scrivere setTableId(100)dà un errore in fase di compilazione. Come posso impostare il valore short senza dichiarare un'altra variabile short?

Quando si imposta il Longvalore posso usare setLongValue(100L)e funziona. Allora, cosa Lsignifica qui e qual è il carattere per Shortvalore?

Grazie


Lè solo un suffisso usato per indicare un longletterale.
Missingfaktor

Risposte:


174

In Java, i valori letterali interi sono di tipo int per impostazione predefinita. Per alcuni altri tipi, si può suffisso letterale con una lettera maiuscole e minuscole come L, D, Fper specificare un lungo, doppio, o galleggiante, rispettivamente. Si noti che è pratica comune utilizzare lettere maiuscole per una migliore leggibilità.

La specifica del linguaggio Java non fornisce lo stesso zucchero sintattico per i tipi byte o brevi. Invece, puoi dichiararlo come tale usando il casting esplicito:

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

Nella setLongValue(100L)chiamata al metodo, non è necessario includere necessariamente il Lsuffisso perché in questo caso il valore letterale int viene automaticamente ampliato a lungo. Questo è chiamato ampliamento della conversione primitiva nelle specifiche del linguaggio Java.


16
Ci sono anche suffissi per altri tipi: d/ Dfa un doublee f/ Ffa un float!
Joachim Sauer

6
Inoltre: i letterali che si adattano alla dimensione non hanno bisogno di essere lanciati: i tuoi due esempi funzionano anche senza il cast.
Joachim Sauer

Hai ragione su entrambi. Avrei dovuto essere più chiaro sul fatto che sto parlando di letterali interi qui, non di letterali in virgola mobile.
Lauri

4
@Joachim: Nessun cast richiesto solo per J5 +; J2ME è purtroppo ancora a J4 (un J4 seriamente ridotto al minimo).
Lawrence Dol

2
@JoachimSauer, cosa significa "adattarsi alla taglia"? Mi sto chiedendo perché ho dovuto lanciare specificamente 0come (short)0per aggirare un possible lossy conversion from int to shorterrore, anche se 0 è un breve.
ryvantage

34

Non esiste un byte o un letterale corto. Devi lanciare a breve usando(short)100


9

In genere puoi semplicemente eseguire il cast della variabile per diventare un file short.

Puoi anche avere problemi come questo che possono creare confusione. Questo perché l' +operatore li promuove a un fileint

inserisci qui la descrizione dell'immagine

Lanciare gli elementi non aiuta:

inserisci qui la descrizione dell'immagine

Devi lanciare l'espressione:

inserisci qui la descrizione dell'immagine


1
Non dimenticare che c'è un motivo per cui short + short = int. Se la somma di due cortometraggi è superiore al valore massimo di short della macchina, lanciarlo a short produrrà risultati inaspettati o genererà un'eccezione, se supportato da languaje.
DGoiko

2
Con questa logica, l'aggiunta di due int restituirebbe un lungo;)
matt brucia il

1
E lo cerco se le mie somme possono superare Integer.MAX_VALUE. Non sto difendendo la decisione di restituire int (che è probabilmente collegato al modo in cui l'HW esegue effettivamente le somme), sto solo dicendo che le persone dovrebbero confermare che il risultato effettivamente riempie un breve prima di metterlo lì. Ho riscontrato più bug che limitano la capacità ridotta rispetto al limite int, probabilmente a causa delle dimensioni dei numeri coinvolti. 2 minuscoli bytes java reservers per short cap molto veloci
DGoiko

1
Ho letto di nuovo il mio commento e non ho chiarito il mio punto. La prima frase è confusa e non avrei dovuto dirlo e ho lasciato il resto, sembra che ci siano due affermazioni correlate. Il motivo dietro short + short essere int può essere letto qui: docs.oracle.com/javase/specs/ jvms / se8 / html /… , non ci sono operazioni di somma in breve in JVM. L'int di Java è di 32 bit, e quando questa decisione è stata presa, la maggior parte dei computer era a 32 bit, quindi int sembrava l'idea migliore, immagino.
DGoiko,

1
Si noti inoltre che, come spiegato qui stackoverflow.com/a/27123302/9465588 , JVM ha effettivamente servito almeno 32 bit del suo spazio di memoria virtuale per campo classe, quindi la dichiarazione di campi brevi non fa risparmiare memoria. Non so se Java abbia cambiato questo. Tendo a non usare mai valori brevi a meno che non sia coinvolta una restrizione esterna, come in un DAO
DGoiko

8

Puoi usare setTableId((short)100). Penso che questo sia stato modificato in Java 5 in modo che i valori letterali numerici assegnati a byte o short e all'interno dell'intervallo per l'obiettivo vengano automaticamente considerati il ​​tipo di destinazione. Tuttavia, le ultime JVM J2ME derivano da Java 4.


PS: Benvenuti nel dolore bloccato nel medioevo della codifica per J2ME. Non vedo l'ora che i dispositivi portatili raggiungano i desktop dell'anno 2000.
Lawrence Dol

3
Non c'è "J4" (né "J5". Per favore, non rendere lo schema di denominazione / versione di Java più confuso di quanto non sia già.
Joachim Sauer

2
@Joachim: Java 1, Java 2, Java 5, Java 6 e Java 7 sono ben noti e sono così indicati; non è troppo difficile estrapolare cosa significherebbe Java 3 e Java 4. "Jn" è semplicemente un'abbreviazione dell'ovvio. L'adozione della nomenclatura attuale (e si spera finale) di Sun per tutte le versioni riduce la confusione.
Lawrence Dol

2
@Joachim: Secondo l'ultima parola di Sun sull'argomento, il primo "1" iniziale di Java "1.x" deve essere trattato come se non fosse mai stato presente quando si fa riferimento alle versioni in discussione e viene mantenuto nella versione emessa dalle JVM solo per compatibilità. Pertanto, Java 2 è quella versione precedentemente nota come 1.2, da cui proveniva originariamente J2SE (noterai che allo stesso tempo Sun consigliava di non utilizzare più J2xE, ma piuttosto JavaEE, JavaSE e JavaME). Ne consegue che 1.3 è Java 3, 1.4 è Java 4, 1.5 è Java 5, 1.6 è Java 6 e 1.7 è Java 7. Seriamente, non è così difficile ragionare.
Lawrence Dol

2
Il "1." era solo tagliato in Java 5 e versioni successive. Sun fa sempre riferimento a Java 1.0-1.4 con quel nome. E questo viene fatto intenzionalmente, perché Sun ha usato "Java 2" per fare riferimento a Java 1.2 fino a Java 1.5 / Java 5. È molto confuso, ma inventare nuovi nomi che Sun non ha mai usato non lo rende più facile.
Joachim Sauer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.