Bir nesneyi int


221

Java'da int nesnesine nasıl Nesne atabilirim?


6
Gerçekten ne yapmak istiyorsun? Eğer Objectbir değil Integer, emin senin senin döküm ne bekliyoruz değilim.
unholysampler

2
önce instanceof anahtar sözcüğünü kontrol edin. doğruysa, o zaman dökün.
Ölü Programcı

Ayy. Winapi sabitleri için enum'lara sahip olabilmem için enum üyelerinin belirli tamsayı değerlere dökülmesini istedim. msdn.microsoft.com/tr-tr/library/windows/desktop/…
Tomáš Zato - Monica'yı eski durumuna döndür

@ TomášZato Bunu (bir çeşit) yapabilirsiniz, sadece tamsayı değerini tutmak için numaralandırmanızda bir alan tanımlayın (diyelim ki intValue), sıralamanız için bir yapıcı oluşturun intValue, enum sabitlerinizin bu yapıcıyı çağırmasını sağlayın ve bir alıcı ekleyin için intValue. Ardından, döküm yapmak yerine alıcıyı arayın.
Brian McCutchon

Yanıtlar:


385

Bu nesnenin aşağıdakilerden biri olduğundan eminseniz Integer:

int i = (Integer) object;

Veya, Java 7'den başlayarak, eşdeğer şekilde yazabilirsiniz:

int i = (int) object;

Dikkat edin, ClassCastExceptionnesneniz Integerbir NullPointerExceptiondeğilse ve nesneniz ise bir null.

Bu şekilde, Nesnenizin bir Tamsayı (sarılmış int) olduğunu ve bunu bir int olarak açtığınızı varsayarsınız.

intbir ilkeldir, bu yüzden bir olarak saklanamaz Object, tek yol olarak intdüşünülen / kutulanmış Integerolarak bir Object.


Nesneniz a ise String, Integer.valueOf()yöntemi basit bir int'e dönüştürmek için kullanabilirsiniz :

int i = Integer.valueOf((String) object);

NumberFormatExceptionNesneniz gerçekten Stringbir tamsayı içeriğine sahip değilse bir a atabilir .


Kaynaklar:

Aynı konuda:


NullPointerException hakkında emin misiniz? Bir null Nesnenin sadece bir null Tamsayı vereceğini düşündüm ....
Etienne de Martel

7
NullPointerExceptionAit kutudan çıkarma esnasında oluşacak Integeriçineint
Colin Hebert

Bir int'e döküm yapmıyorsunuz, hiçbir Nesne bir int'e atılamaz. Aslında Integer için ve sonra bir int otomatik boks.
Steve Kuo

1
@Steve Kuo, evet, tam olarak söylediğim şey. Bu yüzden "oyuncu" kelimesini kullanmadım.
Colin Hebert

@Etienne: Boş bir Nesneyi bir Tamsayıya aktarabilir, böylece boş bir Tamsayı elde edebilirsiniz. Ancak int'i buradan çıkarmaya çalıştığınızda, boş bir işaretçi istisnası alırsınız. "Null int" diye bir şey yoktur.
Jay

18

Nesnenin bir nesne olduğunu varsayarsak, Integerbunu yapabilirsiniz:

int i = ((Tamsayı) obj) .intValue ();

Nesne bir Integernesne değilse , türü algılamanız ve türüne göre dönüştürmeniz gerekir.


Obj null olursa, bir NullPointerException oluşturur.
Colin Hebert

ve bir Integer nesnesi değilse bir ClassCastException.
Erick Robertson

1
intValueOtomatik boks için çağırmanıza gerek yok , onu sizin için çağırır.
OscarRyz

1
intValueözellikle birbiriyle intdeğiştirilebilir olma arasındaki başlangıçtaki karışıklık göz önüne alındığında çok daha nettir Integer.
Steve Kuo

14

Senaryo 1: Basit vaka

Nesnenizin bir olduğu garanti edilirse Integer, bu basit yoldur:

int x = (Integer)yourObject;

Senaryo 2: herhangi bir sayısal nesne

Java'da Integer, Long, BigIntegervb tüm uygulamak Numberadında bir yöntemi vardır arayüz intValue. Sayısal yönü olan diğer özel türler de uygulanmalıdır Number(örneğin:) Age implements Number. Böylece yapabilirsiniz:

int x = ((Number)yourObject).intValue();

Senaryo 3: sayısal metni ayrıştırma

Komut satırından (veya metin alanı vb.) Kullanıcı girişini kabul ettiğinizde String. Bu durumda şunları kullanabilirsiniz Integer.parseInt(String string):

String input = someBuffer.readLine();
int x = Integer.parseInt(input);

Eğer girdi olarak alırsanız Object, kullanabileceğiniz (String)inputbir diğer metinsel türü olabilir, eğer, ya input.toString():

int x = Integer.parseInt(input.toString());

Senaryo 4: Kimlik karması

Java'da işaretçi yoktur. Ancak Object, hashCode()üzerinden doğrudan kullanılabilen işaretçi benzeri bir varsayılan uygulamaya sahiptir System.identityHashCode(Object o). Böylece yapabilirsiniz:

int x = System.identityHashCode(yourObject);

Bunun gerçek bir işaretçi değeri olmadığını unutmayın . Nesnelerin bellek adresleri, kimlik karmaları korunurken JVM tarafından değiştirilebilir. Ayrıca, iki canlı nesne aynı kimlik karmasına sahip olabilir.

Ayrıca kullanabilirsiniz object.hashCode(), ancak türe özgü olabilir.

Senaryo 5: benzersiz dizin

Aynı durumlarda, veritabanı tablosundaki ID değerlerini otomatik olarak artırmak (ve benzersiz olmayan kimlik karmasının aksine) gibi, her nesne için benzersiz bir dizine ihtiyacınız vardır. Bunun için basit bir örnek uygulama:

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;
        }
    }

}

Kullanımı:

ObjectIndexer indexer = new ObjectIndexer();
int x = indexer.indexFor(yourObject);    // 1
int y = indexer.indexFor(new Object());  // 2
int z = indexer.indexFor(yourObject);    // 1

Senaryo 6: numaralandırma üyesi

Java enum üyeleri tamsayı değil tam özellikli nesnelerdir (örneğin C / C ++ 'dan farklı olarak). Muhtemelen bir enum nesnesini dönüştürmeye hiç gerek yoktur int, ancak Java otomatik olarak her bir enum üyesiyle bir dizin numarası ilişkilendirir. Bu indekse, Enum.ordinal()örneğin:

enum Foo { BAR, BAZ, QUX }

// ...

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

resim açıklamasını buraya girin


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");
    }
}

Gördüğünüz gibi, bu çok etkili bir yöntem değil. Sadece ne tür bir nesneye sahip olduğunuzdan emin olmalısınız. Sonra doğru bir int dönüştürmek.


@Deprecated değil mi (a yerine)? :) Güzel yöntem olsa da, nesnenin türü hakkında hiçbir varsayımlarda bulunmaz.
extraneon

Bu arada, normal ifadeniz hex veya oct yarıçapını dikkate almaz. ToInt akıllı bir yöntemdir. NumberFormatExcepytion'ı denemek ve yakalamak için daha iyi.
extraneon

4

Bir Integer'a (int'in sarmalayıcı sınıfı) atamanız gerekir. Daha sonra iç int elde etmek için Integer'ın intValue () yöntemini kullanabilirsiniz.


4

Cevap:

int i = ( Integer ) yourObject;

Nesneniz zaten bir tamsayı ise, düzgün çalışır. yani:

Object yourObject = 1;
//  cast here

veya

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

vb.

Nesneniz başka bir şeyse, onu (mümkünse) önce int'ye dönüştürmeniz gerekir:

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

Veya

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

4

GSON'dan veri işlerken tek astar kullanıyorum:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;

Bu uzun bir süreç. Double.valueOf (object.toString ()). İntValue ( ) yerine (int) Nesnesi yapmanız yeterlidir . Bu sadece sayılar için çalışıyor, ihtiyacımız olan şey bu.
Sudhakar Krishnan

1
@SudhakarK: (int) Nesne yalnızca nesneniz bir Tamsayı ise çalışır. Bu oneliner ayrıca Dize numaralarını da destekler; EG "332".
Jacob van Lingen

2

Eğer Objectbaşlangıçta bir şekilde örneklerle desteklendi edildi Integer, o zaman bir o downcast edebilirsiniz intdöküm operatörü kullanılarak (Subtype).

Object object = new Integer(10);
int i = (Integer) object;

Not Birlikte en az Java 1.5 kullanırken bu sadece çalışır özelliği Autoboxing aksi takdirde beyan etmek zorunda, iolarak Integeryerine ve sonra çağrı intValue()üzerine .

Ama başlangıçta bir olarak yaratılmamışsa Integer, o zaman böyle mahzun olamazsınız. Bu ClassCastException, iletide orijinal sınıf adına sahip bir a ile sonuçlanır . Nesnenin toString()elde ettiği String#valueOf()şekliyle ifadesi, sözdizimsel olarak geçerli bir tamsayı numarasını belirtirse (örneğin, eksi işareti önde ise yalnızca basamaklar), bunun için Integer#valueOf()veya öğesini kullanabilirsiniz new Integer().

Object object = "10";
int i = Integer.valueOf(String.valueOf(object));

Ayrıca bakınız:


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

int i = Integer.parseInt((String)object); //Type is String.

2

Yapamam. An intbir nesne değil, ilkel bir tiptir. Tamsayıya yayınlayabilir, ardından int'i alabilirsiniz.

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

 int num = i; //Java 1.5 or higher

Bu, nesnenin neredeyse kesinlikle olmadığı bir tamsayı olduğunu varsayar. Muhtemelen dize çözümü ala Coronauts istiyor
Bill K

Bir nesneyi Nesneye dönüştürdüğünüzde ve sonra bunu bir Tamsayı değişkenine ayarlamaya çalıştığınızda nasıl derlenebilir.
Carlos

2

Yapamazsın. An intbir değildir Object.

Integerbir olduğunu Objectgerçi, ama ben ne demek istediğini şüpheliyim.


Java 5'ten beri otomatik boks / kutudan çıkarma var
Bruno

@Bruno: Bir nesneyi int'ye atayamazsınız. Bir Nesneyi bir Tamsayıya aktarabilir ve daha sonra bir int'e atayabilirsiniz ve sihirli bir şekilde otomatik olarak açılır Ancak bir nesneyi bir int'e atayamazsınız.
Jay

Şahsen, insanların otomatik boksa dayanan çok sayıda kötü kod oluşturduğunu düşünüyorum. Geçen gün bir ifade gördüm, "Çift miktar = (Double.parseDouble (stringAmount)). DoubleValue ();". Yani, bir çift ilkel almak için bir String'i ayrıştırdı, sonra buna karşı bir işlev yürüttü, bu da derleyiciyi bir Double nesnesine otomatik olarak kutuya koymaya zorladı, ancak işlev doubleValue'ydu, bu da daha sonra bir Double'e verdi. böylece otomatik kutuyu zorlar. Yani, ilkelden nesneye, ilkelden nesneye, 3 dönüşüme dönüştü.
Jay

@Jay, 1. yorum üzerinde anlaştım (üzgünüm kendimi net değildi). Çok fazla dönüşümle ilgili olarak, haklısınız, ancak JIT derleyicisinin bununla iyi başa çıkabileceği izlenimini edindim, bu yüzden pratikte çok fazla önemli olmamalı (bu mutlaka kötü kod için bir bahane yapmaz) ...)
Bruno

1
@Bruno Beklenmedik NullPointerExceptions verebileceği otomatik kutulamanın zor kısmı.
extraneon

1

İnt için bir String yazmayı kastediyorsanız, kullanın Integer.valueOf("123").

Diğer Nesnelerin çoğunu int'e atamazsınız, çünkü int değerine sahip olmazlar. Örneğin, bir XmlDocument öğesinin int değeri yoktur.


1
Kullanmayın Integer.valueOf("123")tek ihtiyacınız bir ilkel yerine kullanmak ise Integer.parseInt("123")çünkü valueOf yöntemi gereksiz bir unboxing neden olur.
Kerem Baydoğan

1

Sanırım C veya C ++ 'ın neden bir nesne işaretçisini sayı gibi değiştirmenize izin verdiğini merak ediyorsunuz, ancak Java'da bir nesne referansını aynı şekilde değiştiremezsiniz.

Java nesne referansları C veya C işaretçiler gibi değildir ++ ... İşaretçiler temelde olan tamsayılar ve başka int gibi onları manipüle edebilir. Referanslar kasıtlı olarak daha somut bir soyutlamadır ve işaretçilerin yapabileceği şekilde manipüle edilemez.


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

Bu kod neden ArrayListönemli olduğunu ve neden kullandığımızı gösterir. Basitçe döküm intdan Object. Yardımcı olabilir.


Lütfen cevabınızı açıklayın
Gwenc37

1

Örnek Nesne değişkeni için; hastaId

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

Örneğin, bir nesneyi int'e atama,hastaID

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

0

Bu kodu inceleyin:

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);
  }
}

0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;

Bu, dökümün gerekli olduğu bir durumu gösterir ve ben de bu durumla ortaya çıkan hatayı da ekleyeceğim. Yeni bir kodlayıcının örnek yoksa gerçek uygulamayı anlaması zor. Umarım bu örnek onlara yardımcı olur
Nehal Pawar

0

Son olarak, belirtiminiz için en iyi uygulama bulundu.

public int tellMyNumber(Object any) {
    return 42;
}

-4

önce instanceof anahtar sözcüğünü kontrol edin. doğruysa, o zaman dökün.


Bunu kullandım ve şimdi 'Boxed value unboxed is now boxed o satırda nasıl çözüleceğini merak ediyorum. (Spotbugs kontrolleri nedeniyle) bu yüzden şimdi nasıl daha iyi çözeceğini merak ediyorum.
Jasper Lankhorst
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.