Je ne sais pas pourquoi il fait référence au type de données long comme un int
Ce n'est pas. Vous devez apprendre à faire confiance aux messages du compilateur (surtout lorsqu'ils proviennent de compilateurs sains et modernes et non d'anciens compilateurs C / C ++). Bien que la langue qu'ils parlent soit parfois difficile à déchiffrer, ils ne vous mentent généralement pas.
Regardons à nouveau:
Le littéral de int 9223372036854775807 est hors de portée.
Notez qu'il ne mentionne nulle part votre variable testLong
ou le type long
, donc ce n'est pas de l'initialisation. Le problème semble survenir à un autre moment.
Examinons maintenant certaines parties du message:
int
nous dit qu'il veut traiter quelque chose comme un int
valeur (ce qui n'est pas ce que vous vouliez!)
- "hors de portée" est assez clair: quelque chose n'est pas dans la plage attendue (probablement celle de
int
)
- "Le littéral": maintenant c'est intéressant: qu'est-ce qu'un littéral?
Je vais laisser la liste confortable pour parler des littéraux pendant un moment: les littéraux sont des endroits où vous avez une certaine valeur dans votre code. Il y a des String
littéraux, des int
littéraux, des class
littéraux, etc. Chaque fois que vous mentionnez une valeur explicitement dans votre code, c'est un littéral.
Donc, ce n'est pas vraiment vous harceler à propos de la déclaration de variable, mais le nombre lui-même, la valeur est ce qui vous harcèle.
Vous pouvez facilement le vérifier en utilisant le même littéral dans un contexte où a long
et an int
sont également acceptables:
System.out.println(9223372036854775807);
PrintStream.println
peut prendre unint
ou unlong
(ou à peu près n'importe quoi d'autre). Donc, ce code devrait être correct, non?
Non. Peut-être que ça devrait l' être, mais selon les règles, ce n'est pas bien.
Le problème est que "certains chiffres" est défini comme un int
littéral et doit donc être dans la plage définie par int
.
Si vous voulez écrire un long
littéral, vous devez le rendre explicite en ajoutant L
(ou en minuscules l
, mais je vous suggère fortement d' utiliser toujours la variante majuscule, car c'est beaucoup plus facile à lire et plus difficile à confondre avec a 1
).
Notez qu'un problème similaire se produit avec float
(postfix F
/ f
) et double
(postfix D
/ d
).
Note latérale: vous vous rendrez compte qu'il n'y a pas de byte
ou short
littéraux et que vous pouvez toujours attribuer des valeurs (généralement des int
littéraux) à byte
et des short
variables: c'est possible grâce aux règles spéciales du § 5.2 sur Assignment Converson : elles permettent l'affectation d'expressions constantes d'un type plus grand à byte
, short
, char
ou int
si les valeurs se situent dans les types varient.