なぜそれがintとしてlongデータ型を参照しているのかわかりません
そうではない。コンパイラー・メッセージを信頼する方法を学ぶ必要があります(特に、メッセージが正常な最新のコンパイラーからのものであり、古代のC / C ++コンパイラーからのものでない場合)。彼らが話す言語は時々解読するのが難しいかもしれませんが、彼らは通常あなたに嘘をついていません。
もう一度見てみましょう:
int 9223372036854775807のリテラルは範囲外です。
それがいることを注意、しないあなたの変数に言及testLong
またはタイプlong
それはですので、どこでもない、初期化について。問題は別の時点で発生しているようです。
次に、メッセージの一部を調べてみましょう。
int
彼は何かをint
値として扱いたいと思っていることを伝えます(あなたが望んでいたものではありません!)
- 「範囲外」はかなり明確です:何かが期待される範囲内にない(おそらくの範囲外
int
)
- 「リテラル」:面白いですね。リテラルとは何ですか?
少しの間、リテラルについて話すために居心地の良いリストを離れます。リテラルは、コードに何らかの価値がある場所です。String
リテラル、int
リテラル、class
リテラルなどがあります。コードで値を明示的に言及するたびに、それはリテラルです。
したがって、変数の宣言について実際に悩まされているわけではありませんが、数値自体は、値がそれについて悩まされているものです。
これは、a long
とan int
が等しく受け入れられるコンテキストで同じリテラルを使用することで簡単に確認できます。
System.out.println(9223372036854775807);
PrintStream.println
どちらか取ることができますか(または他のほとんど何でも)。そのコードは大丈夫でしょうか?int
long
まあ号、多分それはすべきことが、ルールに従ってそれはある罰金ではありません。
問題は、「いくつかの桁」であると定義されていることをint
リテラルしたがってなければならないことによって定義された範囲内であることint
。
long
リテラルを記述したい場合は、を追加して明示的にする必要がありますL
(または小文字ですが、大文字のバリアントを使用することl
を強くお勧めします1
。読みやすく、と間違えにくいためです)。
float
(postfix F
/ f
)とdouble
(postfix D
/ d
)でも同様の問題が発生することに注意してください。
サイドノートでは:あなたは何も存在しないことを実現しますbyte
かshort
リテラルは、あなたがまだ割り当て値(通常は可能int
にリテラル)byte
とshort
変数:特殊なルールに起因することが可能です割り当てConversonについて§5.2:彼らができるように、より大きなタイプの定数式の割り当てまたは場合種類が範囲内の値です。byte
short
char
int