Cara melemparkan Obyek ke int

221

Bagaimana saya bisa melemparkan Obyek ke int di java?

Sheehan Alam
sumber
6
Apa yang benar-benar ingin Anda lakukan? Jika Objectbukan Integer, saya tidak yakin apa yang Anda harapkan dari pemeran Anda.
unholysampler
2
periksa dulu dengan instanceof kata kunci. jika benar maka dilemparkan.
Dead Programmer
Aww. Saya hanya ingin memiliki anggota enum untuk memberikan nilai integer tertentu, sehingga saya dapat memiliki enum untuk konstanta winapi. msdn.microsoft.com/en-us/library/windows/desktop/…
Tomáš Zato - Reinstate Monica
@ 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.
Brian McCutchon

Jawaban:

385

Jika Anda yakin bahwa objek ini adalah Integer:

int i = (Integer) object;

Atau, mulai dari Java 7, Anda dapat menulis:

int i = (int) object;

Hati-hati, ia bisa melempar ClassCastExceptionjika objek Anda bukan Integerdan NullPointerExceptionjika objek Anda null.

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.


Sumber:

Pada topik yang sama:

Colin Hebert
sumber
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.

Erick Robertson
sumber
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:

class ObjectIndexer {

    private int index = 0;

    private Map<Object, Integer> map = new WeakHashMap<>();

    public int indexFor(Object object) {
        if (map.containsKey(object)) {
            return map.get(object);
        } else {
            index++;
            map.put(object, index);
            return index;
        }
    }

}

Pemakaian:

ObjectIndexer indexer = new ObjectIndexer();
int x = indexer.indexFor(yourObject);    // 1
int y = indexer.indexFor(new Object());  // 2
int 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:

enum Foo { BAR, BAZ, QUX }

// ...

Object baz = Foo.BAZ;
int index = ((Enum)baz).ordinal(); // 1

masukkan deskripsi gambar di sini

Dávid Horváth
sumber
13
@Deprecated
public static int toInt(Object obj)
{
    if (obj instanceof String)
    {
         return Integer.parseInt((String) obj);
    } else if (obj instanceof Number)
    {
         return ((Number) obj).intValue();
    } else
    {
         String toString = obj.toString();
         if (toString.matches("-?\d+"))
         {
              return Integer.parseInt(toString);
         }
         throw new IllegalArgumentException("This Object doesn't represent an int");
    }
}

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.

Martijn Courteaux
sumber
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.

Etienne de Martel
sumber
4

Menjawab:

int i = ( Integer ) yourObject;

Jika, objek Anda sudah bilangan bulat, itu akan berjalan dengan lancar. yaitu:

Object yourObject = 1;
//  cast here

atau

Object yourObject = new Integer(1);
//  cast here

dll.

Jika objek Anda adalah sesuatu yang lain, Anda harus mengubahnya (jika mungkin) menjadi int:

String s = "1";
Object yourObject = Integer.parseInt(s);
//  cast here

Atau

String s = "1";
Object yourObject = Integer.valueOf( s );
//  cast here
OscarRyz
sumber
4

Saya menggunakan one-liner saat memproses data dari GSON:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;
Seseorang disuatu tempat
sumber
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 = new Integer(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));

Lihat juga:

BalusC
sumber
2
int i = (Integer) object; //Type is Integer.

int i = Integer.parseInt((String)object); //Type is String.
Kerem Baydoğan
sumber
2

Tidak bisa dilakukan An intbukan objek, itu tipe primitif. Anda bisa melemparkannya ke Integer, lalu mendapatkan int.

 Integer i = (Integer) o; // throws ClassCastException if o.getClass() != Integer.class

 int num = i; //Java 1.5 or higher
Tom
sumber
Ini mengasumsikan bahwa objek adalah bilangan bulat yang hampir pasti bukan. Mungkin menginginkan solusi string ala Coronauts
Bill K
Bagaimana itu bisa dikompilasi ketika Anda melemparkan objek ke Objek dan kemudian mencoba untuk mengaturnya ke variabel Integer.
Carlos
2

Kamu tidak bisa An intbukan an Object.

Integeradalah Objectmeskipun, tapi aku ragu itu yang Anda maksud.

ekstraneon
sumber
Ada tinju otomatis / unboxing sejak Java 5.
Bruno
@ 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.

Amy B
sumber
1
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.

romacafe
sumber
1
int[] getAdminIDList(String tableName, String attributeName, int value) throws SQLException {
    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[] = new int[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.

Mahbubur Rahman Khan
sumber
Tolong jelaskan jawaban Anda
Gwenc37
1

Untuk variabel Contoh Objek; hastaId

Object hastaId = session.getAttribute("hastaID");

Sebagai Contoh Keluarkan Objek ke int,hastaID

int hastaID=Integer.parseInt(String.valueOf(hastaId));
pengguna4391934
sumber
0

Lihat kode ini:

public class sample 
{
  public static void main(String[] args) 
  {
    Object obj=new Object();
    int a=10,b=0;
    obj=a;
    b=(int)obj;

    System.out.println("Object="+obj+"\nB="+b);
  }
}
Bubut Vishal
sumber
0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;
Nehal Pawar
sumber
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.

public int tellMyNumber(Object any) {
    return 42;
}
Dávid Horváth
sumber
-4

periksa dulu dengan instanceof kata kunci. jika benar maka dilemparkan.

Programmer Mati
sumber
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.
Jasper Lankhorst