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