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 testLongatau jenisnya di longmana pun, jadi ini bukan tentang inisialisasi. Masalahnya tampaknya terjadi di beberapa titik lain.
Sekarang mari kita selidiki beberapa bagian dari pesan tersebut:
intmemberi tahu kami bahwa dia ingin memperlakukan sesuatu sebagai intnilai (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 Stringliteral, intliteral, classliteral 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 longdan an intsama-sama dapat diterima:
System.out.println(9223372036854775807);
PrintStream.printlndapat 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 intliteral dan oleh karena itu harus berada dalam kisaran yang ditentukan oleh int.
Jika Anda ingin menulis longliteral, 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 byteatau shortliteral dan Anda masih dapat menetapkan nilai (biasanya intliteral) ke variabel bytedan 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, charatau int jika nilai-nilai dalam jenis berkisar.