Je ne sais pas pourquoi il est fait référence au type de données long comme un int
Il n'est pas. Vous devez apprendre à faire confiance aux messages compilateur (surtout quand ils sont de sane, les compilateurs modernes et pas les anciens compilateurs C/C++). Alors que la langue qu'ils parlent peut-être dur à déchiffrer parfois, ils ne sont généralement pas de vous mentir.
Regardons de nouveau:
La traduction littérale de l'int 9223372036854775807 est hors de portée.
Notez qu'il n'est pas de mentionner votre variable testLong
ou le type long
n'importe où, donc c'est pas sur l'initialisation. Le problème semble se produire à un autre moment.
Maintenant permet d'étudier certaines parties du message:
-
int
nous dit qu'il veut traiter quelque chose en int
de la valeur (ce qui n'est pas ce que tu voulais!)
- "hors de portée" est assez clair: quelque chose n'est pas dans la fourchette prévue (probablement celle de
int
)
- "Le littéral": c'est intéressant: qu'est ce qu'un littéral?
Je vais quitter le douillet liste de parler de littéraux pour un moment: les littéraux sont des endroits où vous avez un peu de valeur dans votre code. Il y a String
littéraux, int
littéraux, class
littéraux et ainsi de suite. Chaque fois que vous indiquez une valeur explicitement dans votre code, c'est un littéral.
Il n'est donc pas réellement lancinante vous au sujet de la déclaration de la variable, mais le nombre, la valeur est ce qu'il est tenace.
Vous pouvez facilement vérifier cela en utilisant le même littéral dans un contexte où une long
et int
sont également acceptables:
System.out.println(9223372036854775807);
PrintStream.println
peut prendre soit une int
ou un long
(ou n'importe quoi d'autre). De sorte que le code devrait être bon, non?
Pas de. Eh bien, peut-être qu'il devrait être, mais selon les règles, c' est pas bien.
Le problème est que "quelques chiffres" est défini à l' int
littérale et, par conséquent, doit être dans la gamme définie par int
.
Si vous voulez écrire un long
littéral, alors vous devez faire explicite, par l'ajout de la L
(ou moins de cas l
, mais je extrêmement vous suggère d'utiliser toujours la majuscule variante, parce qu'il est beaucoup plus facile à lire et plus difficile d'erreur pour un 1
).
Notez qu'un problème similaire se produit avec float
(postfix F
/f
) et double
(postfix D
/d
).
Remarque: vous réaliserez qu'il n'y a aucun byte
ou short
littéraux et vous pouvez toujours affecter des valeurs (habituellement int
littéraux) byte
et short
variables: c'est possible grâce à des règles spéciales dans le§ 5.2 au sujet de l'Affectation Converson: ils permettent d'affectation des expressions constantes d'un plus grand type d' byte
, short
, char
ou int
si les valeurs sont à l'intérieur de la types de gamme.