Ich weiß nicht, warum es sich um den langen Datentyp als int handelt
Es ist nicht. Sie sollten lernen, Compiler-Nachrichten zu vertrauen (insbesondere, wenn sie von vernünftigen, modernen Compilern und nicht von alten C / C ++ - Compilern stammen). Während die Sprache, die sie sprechen, manchmal schwer zu entziffern ist, lügen sie dich normalerweise nicht an.
Schauen wir es uns noch einmal an:
Das Literal von int 9223372036854775807 liegt außerhalb des Bereichs.
Beachten Sie , dass es nicht der Fall ist Ihre Variable erwähnen testLong
oder die Art long
überall, es ist also nicht über die Initialisierung. Das Problem scheint an einem anderen Punkt aufzutreten.
Lassen Sie uns nun einige Teile der Nachricht untersuchen:
int
sagt uns, dass er etwas als int
Wert behandeln möchte (was nicht das ist, was Sie wollten!)
- "außerhalb der Reichweite" ist ziemlich klar: etwas liegt nicht im erwarteten Bereich (wahrscheinlich der von
int
)
- "Das Wörtliche": Nun, das ist interessant: Was ist ein Wörtlich?
Ich werde die gemütliche Liste verlassen, um einen Moment über Literale zu sprechen: Literale sind Orte, an denen Sie einen gewissen Wert in Ihrem Code haben. Es gibt String
Literale, int
Literale, class
Literale und so weiter. Jedes Mal, wenn Sie einen Wert explizit in Ihrem Code erwähnen , handelt es sich um ein Literal.
Es nervt Sie also nicht wirklich an der Variablendeklaration, sondern an der Zahl selbst, der Wert ist das, worüber es Sie nervt.
Sie können dies leicht überprüfen, indem Sie dasselbe Literal in einem Kontext verwenden, in dem a long
und an int
gleichermaßen akzeptabel sind:
System.out.println(9223372036854775807);
PrintStream.println
kann entweder einint
oder einlong
(oder so ziemlich alles andere) nehmen. Der Code sollte also in Ordnung sein, oder?
Nein . Nun, vielleicht ist es sollte sein, aber nach den Regeln es ist nicht in Ordnung.
Das Problem ist, dass "einige Ziffern" als int
Literal definiert sind und daher in dem durch definierten Bereich liegen müssenint
.
Wenn Sie ein long
Literal schreiben möchten, müssen Sie dies explizit machen, indem Sie das L
(oder Kleinbuchstaben) anhängen. l
Ich empfehle jedoch dringend , immer die Großbuchstabenvariante zu verwenden, da es viel einfacher zu lesen und schwerer mit a zu verwechseln ist 1
.
Beachten Sie, dass ein ähnliches Problem bei float
(postfix F
/ f
) und double
(postfix D
/ d
) auftritt .
Randnotiz: Sie werden feststellen, dass es keine byte
oder short
Literale gibt und Sie können weiterhin Werte (normalerweise int
Literale) byte
und short
Variablen zuweisen. Dies ist aufgrund spezieller Regeln in § 5.2 über Zuweisungskonverter möglich : Sie ermöglichen die Zuweisung von konstanten Ausdrücken eines größeren Typs auf byte
, short
, char
oder int
wenn die Werte innerhalb der Arten liegen.