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 testLongo il tipo da longnessuna parte, quindi non riguarda l'inizializzazione. Il problema sembra verificarsi in un altro punto.
Ora esaminiamo alcune parti del messaggio:
intci dice che vuole trattare qualcosa come un intvalore (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 Stringletterali, intletterali, classletterali 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 longe an intsono ugualmente accettabili:
System.out.println(9223372036854775807);
PrintStream.printlnpuò 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 intletterale e quindi deve essere compreso nell'intervallo definito da int.
Se vuoi scrivere un longletterale, 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 byteo shortletterali e puoi ancora assegnare valori (solitamente intletterali) a bytee shortvariabili: 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, charo int se i valori sono fra i tipi gamma.