Saya tidak tahu mengapa ini mengacu pada tipe data panjang sebagai int
Bukan itu. Anda harus belajar memercayai pesan kompilator (terutama jika pesan tersebut berasal dari kompiler modern yang waras dan bukan dari kompiler C / C ++ kuno). Meskipun bahasa yang mereka gunakan terkadang sulit diartikan, mereka biasanya tidak berbohong kepada Anda.
Mari kita lihat lagi:
Literal int 9223372036854775807 berada di luar jangkauan.
Perhatikan, itu tidak menyebutkan variabel Anda testLong
atau jenisnya di long
mana pun, jadi ini bukan tentang inisialisasi. Masalahnya tampaknya terjadi di beberapa titik lain.
Sekarang mari kita selidiki beberapa bagian dari pesan tersebut:
int
memberi tahu kami bahwa dia ingin memperlakukan sesuatu sebagai int
nilai (yang bukan yang Anda inginkan!)
- "di luar jangkauan" cukup jelas: ada sesuatu yang tidak dalam kisaran yang diharapkan (mungkin dari
int
)
- "The literal": sekarang itu menarik: apa itu literal?
Saya akan meninggalkan daftar nyaman untuk membicarakan literal sejenak: literal adalah tempat di mana Anda memiliki nilai dalam kode Anda. Ada String
literal, int
literal, class
literal dan sebagainya. Setiap kali Anda menyebutkan nilai secara eksplisit dalam kode Anda, itu literal.
Jadi sebenarnya ini tidak mengganggu Anda tentang deklarasi variabel, tetapi nomor itu sendiri, nilainya adalah apa yang mengganggu Anda.
Anda dapat dengan mudah memverifikasi ini dengan menggunakan literal yang sama dalam konteks di mana a long
dan an int
sama-sama dapat diterima:
System.out.println(9223372036854775807);
PrintStream.println
dapat mengambil salah satuint
atau along
(atau yang lainnya). Jadi kode itu seharusnya baik-baik saja, bukan?
No Yah, mungkin itu harus menjadi, tetapi menurut aturan itu adalah tidak baik.
Masalahnya adalah bahwa "beberapa digit" didefinisikan sebagai int
literal dan oleh karena itu harus berada dalam kisaran yang ditentukan oleh int
.
Jika Anda ingin menulis long
literal, maka Anda harus membuatnya eksplisit dengan menambahkan L
(atau huruf kecil l
, tapi saya sangat menyarankan Anda selalu menggunakan varian huruf besar, karena jauh lebih mudah dibaca dan lebih sulit untuk salah untuk a 1
).
Perhatikan bahwa masalah serupa terjadi dengan float
(postfix F
/ f
) dan double
(postfix D
/ d
).
Catatan samping: Anda akan menyadari bahwa tidak ada byte
atau short
literal dan Anda masih dapat menetapkan nilai (biasanya int
literal) ke variabel byte
dan short
: hal itu dimungkinkan karena aturan khusus di § 5.2 tentang Assignment Converson : mereka mengizinkan penetapan ekspresi konstan dari tipe yang lebih besar untuk byte
, short
, char
atau int
jika nilai-nilai dalam jenis berkisar.