Setting Short Value Java


114

Saya menulis kode kecil di J2ME. Saya memiliki kelas dengan metode setTableId(Short tableId). Sekarang ketika saya mencoba untuk menulis setTableId(100)itu memberikan kesalahan waktu kompilasi. Bagaimana cara menetapkan nilai pendek tanpa mendeklarasikan variabel pendek lainnya?

Saat mengatur Longnilai, saya dapat menggunakan setLongValue(100L)dan berhasil. Jadi, apa Lartinya di sini dan apa karakter Shortnilainya?

Terima kasih


Lhanyalah sufiks yang digunakan untuk menunjukkan longliteral.
missingfaktor

Jawaban:


174

Di Java, literal integer adalah tipe int secara default. Untuk beberapa jenis lain, Anda mungkin akhiran literal dengan huruf-sensitif seperti L, D, Funtuk menentukan panjang, ganda, atau mengambang, masing-masing. Perhatikan bahwa penggunaan huruf besar merupakan praktik umum agar lebih mudah dibaca.

Spesifikasi Bahasa Java tidak menyediakan gula sintaksis yang sama untuk tipe byte atau pendek. Sebagai gantinya, Anda dapat mendeklarasikannya menggunakan transmisi eksplisit:

byte foo = (byte)0;
short bar = (short)0;

Dalam setLongValue(100L)pemanggilan metode Anda, Anda tidak perlu menyertakan Lsufiks karena dalam kasus ini literal int secara otomatis diperlebar menjadi panjang. Ini disebut konversi primitif pelebaran dalam Spesifikasi Bahasa Java.


16
Ada sufiks untuk tipe lain juga: d/ Dmakes a doubledan f/ Fmakes a float!
Joachim Sauer

6
Juga: literal yang sesuai dengan ukuran tidak perlu dicetak: kedua contoh Anda juga berfungsi tanpa cetakan.
Joachim Sauer

Anda benar pada keduanya. Saya seharusnya lebih jelas bahwa saya berbicara tentang literal integer di sini, bukan tentang literal floating-point.
Lauri

4
@Joachim: Tidak ada pemeran yang diperlukan hanya untuk J5 +; Sayangnya J2ME masih di J4 (J4 yang benar-benar dipreteli).
Lawrence Dol

2
@JoachimSauer, apa artinya "sesuai dengan ukuran"? Aku bertanya karena aku hanya harus khusus dilemparkan 0sebagai (short)0untuk mendapatkan sekitar possible lossy conversion from int to shortkesalahan, meskipun 0 adalah pendek.
ryvantage

34

Tidak ada yang namanya byte atau literal pendek. Anda perlu melakukan cast untuk penggunaan singkat(short)100


9

Umumnya Anda bisa mengubah variabel menjadi a short.

Anda juga bisa mendapatkan masalah seperti ini yang bisa membingungkan. Ini karena +operator mempromosikannya menjadiint

masukkan deskripsi gambar di sini

Casting elemen tidak akan membantu:

masukkan deskripsi gambar di sini

Anda perlu memberikan ekspresi:

masukkan deskripsi gambar di sini


1
Jangan lupa ada alasan kenapa short + short = int. Jika jumlah dua short lebih tinggi dari nilai short maksimum mesin, mentransmisikannya menjadi short akan menghasilkan hasil yang tidak diharapkan atau menimbulkan pengecualian, jika didukung oleh bahasa.
DGoiko

2
Dengan logika itu, menambahkan dua int akan menghasilkan long;)
matt membakar

1
Dan saya mencarinya jika jumlah saya melebihi Integer.MAX_VALUE. Saya tidak membela keputusan pengembalian int (yang mungkin terkait dengan cara HW sebenarnya melakukan penjumlahan), saya hanya mengatakan bahwa orang-orang harus memastikan bahwa hasilnya benar-benar terisi sebentar sebelum menaruhnya di sana. Saya telah menemukan lebih banyak bug yang membatasi kapasitas pendek daripada membatasi int juga, mungkin karena ukuran angka yang terlibat. 2 byte kecil server java untuk tutup pendek sangat cepat
DGoiko

1
Saya membaca komentar saya lagi dan saya tidak menjelaskan maksud saya. Kalimat pertama membingungkan dan saya seharusnya tidak mengatakan itu dan hanya meninggalkan sisanya, sepertinya ada dua pernyataan terkait. Alasan dibalik short + short being int dapat dibaca di sini: docs.oracle.com/javase/specs/ jvms / se8 / html /… , tidak ada operasi penjumlahan singkatnya di JVM. Int Java adalah 32 bit, dan ketika keputusan ini dibuat, kebanyakan komputer adalah 32 bit, jadi int tampak seperti ide terbaik, kurasa.
DGoiko

1
Perhatikan juga bahwa, seperti yang dijelaskan di sini stackoverflow.com/a/27123302/9465588 , JVM sebenarnya melayani setidaknya 32 bit ruang memori virtualnya per bidang kelas, jadi mendeklarasikan bidang pendek tidak menghemat memori sama sekali. Saya tidak tahu apakah Java mengubah ini. Saya cenderung tidak pernah menggunakan nilai pendek kecuali ada batasan eksternal yang terlibat, seperti dalam DAO
DGoiko

8

Anda bisa menggunakan setTableId((short)100). Saya pikir ini diubah di Java 5 sehingga literal numerik yang ditetapkan ke byte atau pendek dan dalam jangkauan untuk target secara otomatis dianggap sebagai tipe target. JVM J2ME terbaru itu berasal dari Java 4.


PS: Selamat datang di kesulitan abad pertengahan coding untuk J2ME. Tidak sabar menunggu perangkat genggam mengejar desktop hingga tahun 2000.
Lawrence Dol

3
Tidak ada "J4" (dan tidak ada "J5". Harap jangan membuat skema penamaan / versi Java lebih membingungkan daripada yang sudah ada.
Joachim Sauer

2
@Joachim: Java 1, Java 2, Java 5, Java 6 dan Java 7 sudah terkenal dan begitu dirujuk; tidak terlalu sulit untuk memperkirakan apa yang dimaksud dengan Java 3 dan Java 4. "Jn" hanyalah singkatan dari yang sudah jelas. Mengadopsi nomenklatur Sun saat ini (dan semoga final) untuk semua versi mengurangi kebingungan.
Lawrence Dol

2
@Joachim: Menurut kata terakhir Sun tentang subjek, awalan "1". Java "1.x" harus diperlakukan seolah-olah tidak pernah ada saat merujuk ke versi dalam diskusi, dan dipertahankan dalam versi yang dikeluarkan oleh JVM hanya untuk kompatibilitas. Jadi, Java 2 adalah versi yang sebelumnya dikenal sebagai 1.2, dari mana J2SE awalnya berasal (Anda akan perhatikan bahwa pada saat yang sama Sun merekomendasikan untuk tidak lagi menggunakan J2xE, melainkan JavaEE, JavaSE dan JavaME). Ini berarti 1,3 adalah Java 3, 1,4 adalah Java 4, 1,5 adalah Java 5, 1,6 adalah Java 6 dan 1,7 adalah Java 7. Serius, ini tidak terlalu sulit untuk dijelaskan.
Lawrence Dol

2
The "1." itu hanya dipotong dari di Jawa 5 dan kemudian. Java 1.0-1.4 selalu disebut dengan nama itu oleh Sun. Dan itu dilakukan dengan sengaja, karena Sun menggunakan "Java 2" untuk merujuk ke Java 1.2 hingga Java 1.5 / Java 5. Ini sangat membingungkan, tetapi menemukan nama baru yang tidak pernah digunakan Sun tidak membuatnya lebih mudah.
Joachim Sauer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.