@ TomášZato Anda dapat melakukan itu (semacam), cukup tentukan bidang dalam enum Anda untuk menyimpan nilai integer (katakanlah, intValue), buat konstruktor untuk enum Anda yang menyetel intValue, minta konstanta enum Anda memanggil konstruktor itu, dan tambahkan pengambil untuk intValue. Kemudian, alih-alih casting, panggil pengambil itu.
Dengan cara ini Anda mengasumsikan bahwa Objek Anda adalah Integer (int yang terbungkus) dan Anda membuka kotaknya menjadi int.
intadalah primitif sehingga tidak dapat disimpan sebagai Object, satu-satunya cara adalah dengan intmenganggap / kotak sebagai Integerkemudian disimpan sebagai Object.
Jika objek Anda adalah String, maka Anda dapat menggunakan Integer.valueOf()metode ini untuk mengubahnya menjadi int sederhana:
int i =Integer.valueOf((String) object);
Itu bisa melempar NumberFormatExceptionjika objek Anda tidak benar-benar Stringdengan integer sebagai konten.
Apakah Anda yakin tentang NullPointerException? Saya pikir Obyek nol hanya akan menghasilkan Integer nol ....
Etienne de Martel
7
The NullPointerExceptionakan terjadi selama unboxing dari Integerkeint
Colin Hebert
Anda tidak melakukan casting ke int, tidak ada Object yang bisa dilemparkan ke int. Anda sebenarnya ke Integer dan kemudian melakukan autobox ke int.
Steve Kuo
1
@Steve Kuo, Yap, persis apa yang saya katakan. Itu sebabnya saya tidak menggunakan kata "pemain".
Colin Hebert
@ Etienne: Anda bisa melemparkan Objek nol ke Integer, sehingga mendapatkan Integer nol. Tetapi ketika Anda mencoba untuk mengekstrak int darinya, Anda akan mendapatkan pengecualian null pointer. Tidak ada yang namanya "null int".
Jay
18
Dengan asumsi objek adalah Integerobjek, maka Anda dapat melakukan ini:
int i = ((Integer) obj) .intValue ();
Jika objek bukan Integerobjek, maka Anda harus mendeteksi tipe dan mengubahnya berdasarkan tipenya.
Jika obj adalah null, itu akan melempar NullPointerException.
Colin Hebert
dan ClassCastException jika itu bukan objek Integer.
Erick Robertson
1
Tidak perlu meminta intValueautoboxing akan memintanya untuk Anda.
OscarRyz
1
intValuejauh lebih jelas terutama mengingat kebingungan pemula antara intdipertukarkan dengan Integer.
Steve Kuo
14
Skenario 1: kasus sederhana
Jika dijamin objek Anda adalah Integer, ini adalah cara sederhana:
int x =(Integer)yourObject;
Skenario 2: objek numerik apa pun
Di Jawa Integer, Long, BigIntegerdll semua mengimplementasikan Numberantarmuka yang memiliki metode bernama intValue. Jenis khusus lainnya dengan aspek numerik juga harus diterapkan Number(misalnya Age implements Number:). Jadi kamu bisa:
int x =((Number)yourObject).intValue();
Skenario 3: parsing teks numerik
Ketika Anda menerima input pengguna dari baris perintah (atau bidang teks dll.) Anda mendapatkannya sebagai String. Dalam hal ini Anda dapat menggunakan Integer.parseInt(String string):
String input = someBuffer.readLine();int x =Integer.parseInt(input);
Jika Anda mendapatkan input Object, Anda dapat menggunakan (String)input, atau, jika dapat memiliki jenis tekstual lainnya, input.toString():
int x =Integer.parseInt(input.toString());
Skenario 4: hash identitas
Di Jawa tidak ada petunjuk. Namun Objectmemiliki implementasi default seperti pointer untuk hashCode(), yang tersedia secara langsung melalui System.identityHashCode(Object o). Jadi kamu bisa:
int x =System.identityHashCode(yourObject);
Perhatikan bahwa ini bukan nilai penunjuk nyata. Alamat memori objek dapat diubah oleh JVM sementara hash identitasnya disimpan. Juga, dua benda hidup dapat memiliki hash identitas yang sama.
Anda juga bisa menggunakan object.hashCode(), tetapi bisa juga tipe spesifik.
Skenario 5: indeks unik
Dalam kasus yang sama Anda memerlukan indeks unik untuk setiap objek, seperti untuk menambahkan nilai ID secara otomatis dalam tabel database (dan tidak seperti hash identitas yang tidak unik). Contoh implementasi sederhana untuk ini:
ObjectIndexer indexer =newObjectIndexer();int x = indexer.indexFor(yourObject);// 1int y = indexer.indexFor(newObject());// 2int z = indexer.indexFor(yourObject);// 1
Skenario 6: enum anggota
Dalam Java enum, anggota bukan bilangan bulat tetapi objek berfitur lengkap (tidak seperti C / C ++, misalnya). Mungkin tidak pernah ada kebutuhan untuk mengkonversi objek enum int, namun Java secara otomatis mengaitkan nomor indeks untuk setiap anggota enum. Indeks ini dapat diakses melalui Enum.ordinal(), misalnya:
enumFoo{ BAR, BAZ, QUX }// ...Object baz =Foo.BAZ;int index =((Enum)baz).ordinal();// 1
Seperti yang Anda lihat, ini bukan cara yang sangat efisien untuk melakukannya. Anda hanya perlu memastikan objek apa yang Anda miliki. Kemudian konversikan ke int dengan cara yang benar.
Bukankah itu sudah usang (tidak menggantikan)? :) Metode yang bagus, tidak membuat asumsi pada jenis objek.
extraneon
Omong-omong, regex Anda tidak memperhitungkan radix hex atau oct. ToInt adalah metode yang cerdas. Lebih baik mencoba dan menangkap NumberFormatExcepytion.
extraneon
4
Anda harus melemparkannya ke Integer (kelas pembungkus int). Anda kemudian dapat menggunakan metode IntValue () Integer untuk mendapatkan inner int.
Ini proses yang panjang. Lakukan saja (int) Object alih-alih Double.valueOf (object.toString ()). IntValue () . Ini hanya berfungsi untuk angka, itulah yang kami butuhkan.
Sudhakar Krishnan
1
@SudhakarK: (int) Obyek hanya berfungsi jika objek Anda adalah bilangan bulat. Oneliner ini juga mendukung nomor String; EG "332".
Jacob van Lingen
2
Jika pada Objectawalnya instantiated sebagai Integer, maka Anda dapat intmenurunkannya ke operator operator yang menggunakan (Subtype).
Object object =newInteger(10);int i =(Integer) object;
Catatan bahwa ini hanya bekerja ketika Anda menggunakan setidaknya Java 1.5 dengan autoboxing fitur , jika tidak, anda harus menyatakan isebagai Integergantinya dan kemudian memanggil intValue()di atasnya .
Tetapi jika awalnya tidak dibuat Integersama sekali, maka Anda tidak bisa downcast seperti itu. Itu akan menghasilkan a ClassCastExceptiondengan classname asli dalam pesan. Jika toString()representasi objek seperti yang diperoleh dengan String#valueOf()menunjukkan bilangan integer yang valid secara sintaksis (misalnya digit saja, jika perlu dengan tanda minus di depan), maka Anda dapat menggunakan Integer#valueOf()atau new Integer()untuk ini.
Object object ="10";int i =Integer.valueOf(String.valueOf(object));
@ Bruno: Anda tidak bisa melemparkan Obyek ke int. Anda dapat melemparkan Obyek ke Integer dan kemudian menetapkannya ke int dan itu akan otomatis membuka kotak. Tetapi Anda tidak bisa melemparkan Obyek ke int.
Jay
(lanjutan) Secara pribadi, saya pikir orang membuat banyak kode buruk bergantung pada autoboxing. Seperti, saya melihat pernyataan beberapa hari yang lalu, "Jumlah ganda = (Double.parseDouble (stringAmount)). DoubleValue ();". Artinya, dia mengurai String untuk mendapatkan primitif ganda, kemudian mengeksekusi fungsi terhadap ini, yang memaksa kompiler untuk autobox menjadi objek Double, tetapi fungsinya adalah doubleValue yang mengekstraksi primitif ganda, yang kemudian dia ditugaskan ke sebuah Double objek sehingga memaksa autobox. Artinya, ia dikonversi dari primitif ke objek ke primitif ke objek, 3 konversi.
Jay
@ Jay, menyetujui komentar 1 (maaf saya sendiri tidak jelas). Mengenai terlalu banyak konversi, Anda benar juga, tetapi saya mendapat kesan bahwa kompiler JIT dapat mengatasinya dengan sangat baik, jadi itu seharusnya tidak menjadi masalah dalam praktik (yang tidak selalu menjadikannya alasan untuk kode buruk ...)
Bruno
1
@ Bruno Trik dari autoboxing yang dapat memberi Anda NullPointerExceptions tak terduga.
extraneon
1
Jika maksud Anda melemparkan sebuah String ke int, gunakan Integer.valueOf("123").
Anda tidak dapat melemparkan sebagian besar Objek lain ke int, karena mereka tidak akan memiliki nilai int. Misalnya XmlDocument tidak memiliki nilai int.
Jangan gunakan Integer.valueOf("123")jika semua yang Anda butuhkan adalah primitif daripada digunakan Integer.parseInt("123")karena metode valueOf menyebabkan unboxing yang tidak perlu.
Kerem Baydoğan
1
Saya kira Anda bertanya-tanya mengapa C atau C ++ memungkinkan Anda memanipulasi objek pointer seperti angka, tetapi Anda tidak dapat memanipulasi referensi objek di Jawa dengan cara yang sama.
Referensi objek di Java tidak seperti pointer di C atau C ++ ... Pointer pada dasarnya adalah integer dan Anda dapat memanipulasi mereka seperti int lainnya. Referensi secara sengaja merupakan abstraksi yang lebih konkret dan tidak dapat dimanipulasi seperti cara pointer.
int[] getAdminIDList(String tableName,String attributeName,int value)throwsSQLException{ArrayList list =null;Statement statement = conn.createStatement();ResultSet result = statement.executeQuery("SELECT admin_id FROM "+ tableName +" WHERE "+ attributeName +"='"+ value +"'");while(result.next()){
list.add(result.getInt(1));}
statement.close();int id[]=newint[list.size()];for(int i =0; i < id.length; i++){try{
id[i]=((Integer) list.get(i)).intValue();}catch(NullPointerException ne){}catch(ClassCastException ch){}}return id;}// enter code here
Kode ini menunjukkan mengapa ArrayListitu penting dan mengapa kami menggunakannya. Cukup casting intdari Object. Semoga bermanfaat.
Ini menunjukkan situasi di mana casting diperlukan dan saya akan menambahkan kesalahan juga yang benar-benar muncul dengan situasi ini. Sulit bagi pembuat kode baru untuk mengetahui implementasi aktual jika tidak ada contoh. Saya harap contoh ini membantu mereka
Nehal Pawar
0
Akhirnya, implementasi terbaik untuk spesifikasi Anda ditemukan.
Saya menggunakan ini dan sekarang saya bertanya-tanya bagaimana cara memecahkan 'nilai Boxed adalah unboxed lalu immeditaley reboxed' pada baris itu. (Karena cek kutu busuk) jadi sekarang saya ingin tahu bagaimana menyelesaikannya dengan lebih baik.
Object
bukanInteger
, saya tidak yakin apa yang Anda harapkan dari pemeran Anda.intValue
), buat konstruktor untuk enum Anda yang menyetelintValue
, minta konstanta enum Anda memanggil konstruktor itu, dan tambahkan pengambil untukintValue
. Kemudian, alih-alih casting, panggil pengambil itu.Jawaban:
Jika Anda yakin bahwa objek ini adalah
Integer
:Atau, mulai dari Java 7, Anda dapat menulis:
Hati-hati, ia bisa melempar
ClassCastException
jika objek Anda bukanInteger
danNullPointerException
jika objek Andanull
.Dengan cara ini Anda mengasumsikan bahwa Objek Anda adalah Integer (int yang terbungkus) dan Anda membuka kotaknya menjadi int.
int
adalah primitif sehingga tidak dapat disimpan sebagaiObject
, satu-satunya cara adalah denganint
menganggap / kotak sebagaiInteger
kemudian disimpan sebagaiObject
.Jika objek Anda adalah
String
, maka Anda dapat menggunakanInteger.valueOf()
metode ini untuk mengubahnya menjadi int sederhana:Itu bisa melempar
NumberFormatException
jika objek Anda tidak benar-benarString
dengan integer sebagai konten.Sumber:
Pada topik yang sama:
sumber
NullPointerException
akan terjadi selama unboxing dariInteger
keint
Dengan asumsi objek adalah
Integer
objek, maka Anda dapat melakukan ini:Jika objek bukan
Integer
objek, maka Anda harus mendeteksi tipe dan mengubahnya berdasarkan tipenya.sumber
intValue
autoboxing akan memintanya untuk Anda.intValue
jauh lebih jelas terutama mengingat kebingungan pemula antaraint
dipertukarkan denganInteger
.Skenario 1: kasus sederhana
Jika dijamin objek Anda adalah
Integer
, ini adalah cara sederhana:Skenario 2: objek numerik apa pun
Di Jawa
Integer
,Long
,BigInteger
dll semua mengimplementasikanNumber
antarmuka yang memiliki metode bernamaintValue
. Jenis khusus lainnya dengan aspek numerik juga harus diterapkanNumber
(misalnyaAge implements Number
:). Jadi kamu bisa:Skenario 3: parsing teks numerik
Ketika Anda menerima input pengguna dari baris perintah (atau bidang teks dll.) Anda mendapatkannya sebagai
String
. Dalam hal ini Anda dapat menggunakanInteger.parseInt(String string)
:Jika Anda mendapatkan input
Object
, Anda dapat menggunakan(String)input
, atau, jika dapat memiliki jenis tekstual lainnya,input.toString()
:Skenario 4: hash identitas
Di Jawa tidak ada petunjuk. Namun
Object
memiliki implementasi default seperti pointer untukhashCode()
, yang tersedia secara langsung melaluiSystem.identityHashCode(Object o)
. Jadi kamu bisa:Perhatikan bahwa ini bukan nilai penunjuk nyata. Alamat memori objek dapat diubah oleh JVM sementara hash identitasnya disimpan. Juga, dua benda hidup dapat memiliki hash identitas yang sama.
Anda juga bisa menggunakan
object.hashCode()
, tetapi bisa juga tipe spesifik.Skenario 5: indeks unik
Dalam kasus yang sama Anda memerlukan indeks unik untuk setiap objek, seperti untuk menambahkan nilai ID secara otomatis dalam tabel database (dan tidak seperti hash identitas yang tidak unik). Contoh implementasi sederhana untuk ini:
Pemakaian:
Skenario 6: enum anggota
Dalam Java enum, anggota bukan bilangan bulat tetapi objek berfitur lengkap (tidak seperti C / C ++, misalnya). Mungkin tidak pernah ada kebutuhan untuk mengkonversi objek enum
int
, namun Java secara otomatis mengaitkan nomor indeks untuk setiap anggota enum. Indeks ini dapat diakses melaluiEnum.ordinal()
, misalnya:sumber
Seperti yang Anda lihat, ini bukan cara yang sangat efisien untuk melakukannya. Anda hanya perlu memastikan objek apa yang Anda miliki. Kemudian konversikan ke int dengan cara yang benar.
sumber
Anda harus melemparkannya ke Integer (kelas pembungkus int). Anda kemudian dapat menggunakan metode IntValue () Integer untuk mendapatkan inner int.
sumber
Menjawab:
Jika, objek Anda sudah bilangan bulat, itu akan berjalan dengan lancar. yaitu:
atau
dll.
Jika objek Anda adalah sesuatu yang lain, Anda harus mengubahnya (jika mungkin) menjadi int:
Atau
sumber
Saya menggunakan one-liner saat memproses data dari GSON:
sumber
Jika pada
Object
awalnya instantiated sebagaiInteger
, maka Anda dapatint
menurunkannya ke operator operator yang menggunakan(Subtype)
.Catatan bahwa ini hanya bekerja ketika Anda menggunakan setidaknya Java 1.5 dengan autoboxing fitur , jika tidak, anda harus menyatakan
i
sebagaiInteger
gantinya dan kemudian memanggilintValue()
di atasnya .Tetapi jika awalnya tidak dibuat
Integer
sama sekali, maka Anda tidak bisa downcast seperti itu. Itu akan menghasilkan aClassCastException
dengan classname asli dalam pesan. JikatoString()
representasi objek seperti yang diperoleh denganString#valueOf()
menunjukkan bilangan integer yang valid secara sintaksis (misalnya digit saja, jika perlu dengan tanda minus di depan), maka Anda dapat menggunakanInteger#valueOf()
ataunew Integer()
untuk ini.Lihat juga:
sumber
sumber
Tidak bisa dilakukan An
int
bukan objek, itu tipe primitif. Anda bisa melemparkannya ke Integer, lalu mendapatkan int.sumber
Kamu tidak bisa An
int
bukan anObject
.Integer
adalahObject
meskipun, tapi aku ragu itu yang Anda maksud.sumber
Jika maksud Anda melemparkan sebuah String ke int, gunakan
Integer.valueOf("123")
.Anda tidak dapat melemparkan sebagian besar Objek lain ke int, karena mereka tidak akan memiliki nilai int. Misalnya XmlDocument tidak memiliki nilai int.
sumber
Integer.valueOf("123")
jika semua yang Anda butuhkan adalah primitif daripada digunakanInteger.parseInt("123")
karena metode valueOf menyebabkan unboxing yang tidak perlu.Saya kira Anda bertanya-tanya mengapa C atau C ++ memungkinkan Anda memanipulasi objek pointer seperti angka, tetapi Anda tidak dapat memanipulasi referensi objek di Jawa dengan cara yang sama.
Referensi objek di Java tidak seperti pointer di C atau C ++ ... Pointer pada dasarnya adalah integer dan Anda dapat memanipulasi mereka seperti int lainnya. Referensi secara sengaja merupakan abstraksi yang lebih konkret dan tidak dapat dimanipulasi seperti cara pointer.
sumber
Kode ini menunjukkan mengapa
ArrayList
itu penting dan mengapa kami menggunakannya. Cukup castingint
dariObject
. Semoga bermanfaat.sumber
Untuk variabel Contoh Objek;
hastaId
Sebagai Contoh Keluarkan Objek ke int,
hastaID
sumber
Lihat kode ini:
sumber
sumber
Akhirnya, implementasi terbaik untuk spesifikasi Anda ditemukan.
sumber
periksa dulu dengan instanceof kata kunci. jika benar maka dilemparkan.
sumber