Non so perché si riferisca al tipo di dati lungo come int
Non è. Dovresti imparare a fidarti dei messaggi del compilatore (specialmente quando provengono da compilatori sani e moderni e non da compilatori C / C ++ antichi). Anche se la lingua che parlano potrebbe essere difficile da decifrare a volte, di solito non ti mentono.
Guardiamolo di nuovo:
Il valore letterale di int 9223372036854775807 è fuori intervallo.
Nota che non menziona la tua variabile testLong
o il tipo da long
nessuna parte, quindi non riguarda l'inizializzazione. Il problema sembra verificarsi in un altro punto.
Ora esaminiamo alcune parti del messaggio:
int
ci dice che vuole trattare qualcosa come un int
valore (che non è quello che volevi!)
- "fuori intervallo" è abbastanza chiaro: qualcosa non rientra nell'intervallo previsto (probabilmente quello di
int
)
- "Il letterale": ora è interessante: cos'è un letterale?
Lascerò per un momento l'elenco accogliente per parlare di letterali: i letterali sono luoghi in cui hai un certo valore nel tuo codice. Ci sono String
letterali, int
letterali, class
letterali e così via. Ogni volta che menzioni un valore in modo esplicito nel codice, è letterale.
Quindi non ti sta effettivamente tormentando per la dichiarazione della variabile, ma il numero stesso, il valore è ciò che ti tormenta.
Puoi facilmente verificarlo usando lo stesso letterale in un contesto in cui a long
e an int
sono ugualmente accettabili:
System.out.println(9223372036854775807);
PrintStream.println
può richiedere unint
o unlong
(o praticamente qualsiasi altra cosa). Quindi quel codice dovrebbe andare bene, giusto?
No. Beh, forse dovrebbe essere, ma secondo le regole non va bene.
Il problema è che "alcune cifre" è definito come un valore int
letterale e quindi deve essere compreso nell'intervallo definito da int
.
Se vuoi scrivere un long
letterale, devi renderlo esplicito aggiungendo L
(o minuscolo l
, ma ti consiglio caldamente di usare sempre la variante maiuscola, perché è molto più facile da leggere e più difficile da scambiare per a 1
).
Notare che un problema simile si verifica con float
(postfix F
/ f
) e double
(postfix D
/ d
).
Nota a margine: ti renderai conto che non ci sono byte
o short
letterali e puoi ancora assegnare valori (solitamente int
letterali) a byte
e short
variabili: ciò è possibile grazie a regole speciali nel § 5.2 sulla Conversione di assegnazione : consentono l'assegnazione di espressioni costanti di un tipo più grande a byte
, short
, char
o int
se i valori sono fra i tipi gamma.