Pada contoh berikut
int i = -128;
Integer i2 = (Integer) i; // compiles
Integer i3 = (Integer) -128; /*** Doesn't compile ***/
Integer i4 = (Integer) (int) -128; // compiles
Integer i4 = -128; // compiles
Integer i5 = (int) -128; // compiles
Integer i6 = (Integer) (-128); // compiles
Integer i7 = (Integer) 0-128; // compiles
Aku tidak bisa melemparkan -128
dengan (Integer)
tapi saya dapat menyerahkan (int) -128
.
Saya selalu berpikir -128
adalah int
tipe dan casting itu (int)
harus berlebihan.
Kesalahan pada baris dengan i3
adalah
cannot find symbol variable Integer
Saya mencoba ini dengan Java 6 update 29 dan Java 7 update 1.
EDIT: Anda mendapatkan perilaku yang sama dengan +128
bukannya -128
. Tampaknya ada kebingungan antara operator unary dan binary.
Integer i = -128;
ini harus dikompilasi.Integer i3 = (Integer) (-128);
meskipun menurut.Expression expected
manaInteger
itu.Jawaban:
Kompilator mencoba mengurangi
128
dari(Integer)
alih-alih mentransmisikan-128
keInteger
. Tambahkan()
untuk memperbaikinyaMenurut BoltClock di komentar para pemeran
int
berfungsi sebagaimana mestinya, karena itu adalah kata yang dicadangkan dan oleh karena itu tidak dapat ditafsirkan sebagai pengenal, yang masuk akal bagi saya.Dan Bringer128 menemukan Referensi JLS 15.16 .
Seperti yang Anda lihat, mentransmisikan ke tipe primitif membutuhkan apa saja
UnaryExpression
, sedangkan mentransmisikan ke tipe referensi membutuhkanUnaryExpressionNotPlusMinus
. Ini didefinisikan sebelum CastExpression di JLS 15.15 .sumber
int
adalah kata kunci di Jawa, tetapiInteger
tidak. Karenaint
adalah kata kunci, Anda tidak dapat menggunakannya sebagai pengenal untuk variabel atau kelas, menyisakan satu-satunya kemungkinan yang tersisa untuk itu menjadi typecast. Itu akan menjelaskannya.Saya menemukan referensi JLS. 15.16 .
Seperti yang Anda lihat, mentransmisikan ke tipe primitif membutuhkan apa saja
UnaryExpression
, sedangkan mentransmisikan ke tipe referensi membutuhkanUnaryExpressionNotPlusMinus
. Ini didefinisikan sebelum CastExpression di JLS 15.15 .Anda perlu mengubah cast menjadi tipe primitif:
Atau Anda dapat mengubah ekspresi di sebelah kanan cast menjadi ekspresi unary non-plus-minus:
sumber
Kompilator menafsirkan
-
sebagai operator dua-arg minus, yaitu mencoba mengurangi 128 dari beberapa nomor lain bernamaInteger
, tetapi tidak ada variabel seperti itu dalam ruang lingkup.Ini mengkompilasi:
sumber
(int)
membuat perbedaan.Ini mungkin ada hubungannya dengan penguraian sintaks. Perhatikan itu
bekerja dengan baik.
Secara umum, Anda tidak boleh mentransmisikan ke kelas Integer. Ini melibatkan sesuatu yang disebut auto-boxing, dan dapat menyebabkan beberapa kesalahan kecil dalam kode Anda. Metode yang disukai untuk melakukan apa yang Anda inginkan adalah:
sumber
for (int i in Collection<Integer>)
b / c NPE berada di lokasi yang benar-benar tidak terduga. Saya sebenarnya tidak menggunakan Integer w / autoboxing karena kisaran cache kecil (meskipun dapat ditingkatkan dengan opsi XX) tetapi memiliki kelas yang disebut IntegerProvider (sejak 1.1) untuk melakukan hal yang sama. Menggunakan Map (apapun dari java.util) Integer-> Anything biasanya menghasilkan kinerja yang baik kecuali digunakan untuk kasus-kasus sepele dan hampir selalu ada solusi yang lebih baik.Ini menguraikannya sebagai
Integer <minus operator> 128
dan tidak menemukan variabelInteger
. Anda harus membungkus-128
dalam tanda kurung:sumber
Masalahnya adalah
-
kompilator melihatnya sebagai operator.sumber
Baris 3 diinterpretasikan seperti Anda mencoba mengurangi 128 dari ekspresi di dalam kurung dan ekspresi di dalam kurung bukan dan ekspresi tipe int (Ini memperlakukan '-' sebagai operator '-'). Jika Anda mengubah ekspresi menjadi:
maka compiler akan mengerti bahwa '-' adalah unary minus yang menunjukkan integer negatif.
sumber
Kompilator C # memiliki perilaku yang sama. Ini memberikan petunjuk yang lebih baik mengapa gagal untuk dikompilasi:
sumber