So wandeln Sie ein Objekt in einen Int

221

Wie kann ich ein Objekt in Java in ein Int umwandeln?

Sheehan Alam
quelle
6
Was willst du wirklich machen? Wenn das Objectnicht der Fall ist Integer, bin ich mir nicht sicher, was Sie von Ihrer Besetzung erwarten.
Unholysampler
2
Überprüfen Sie zuerst mit dem Schlüsselwort instanceof. Wenn es wahr ist, dann wirf es.
Toter Programmierer
Aww. Ich wollte nur Enum-Mitglieder haben, die auf bestimmte ganzzahlige Werte umgewandelt werden sollen, damit ich Enums für Winapi-Konstanten haben kann. msdn.microsoft.com/en-us/library/windows/desktop/…
Tomáš Zato - Stellen Sie Monica am
@ TomášZato Sie können dies tun, indem Sie einfach ein Feld in Ihrer Aufzählung definieren, das den ganzzahligen Wert enthält (z. B. intValue), einen Konstruktor für Ihre Aufzählung erstellen, der die festlegt intValue, Ihre Aufzählungskonstanten diesen Konstruktor aufrufen lassen und einen Getter hinzufügen für intValue. Rufen Sie dann den Getter an, anstatt zu wirken.
Brian McCutchon

Antworten:

385

Wenn Sie sicher sind, dass dieses Objekt ein Integer:

int i = (Integer) object;

Ab Java 7 können Sie auch gleichwertig schreiben:

int i = (int) object;

Achtung, es kann ein werfen, ClassCastExceptionwenn Ihr Objekt kein ist Integerund ein, NullPointerExceptionwenn Ihr Objekt ist null.

Auf diese Weise nehmen Sie an, dass Ihr Objekt eine Ganzzahl (das umschlossene Int) ist, und entpacken es in ein Int.

intist ein Grundelement, daher kann es nicht als gespeichert werden Object. Die einzige Möglichkeit besteht darin, ein intals / betrachtet und Integerdann als gespeichert zu haben Object.


Wenn Ihr Objekt a ist String, können Sie es mithilfe der Integer.valueOf()Methode in ein einfaches int konvertieren:

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

Es kann ein werfen, NumberFormatExceptionwenn Ihr Objekt nicht wirklich ein Stringmit einer Ganzzahl als Inhalt ist.


Ressourcen:

Zum gleichen Thema:

Colin Hebert
quelle
Sind Sie sicher über die NullPointerException? Ich dachte, dass ein Null-Objekt nur eine Null-Ganzzahl ergeben würde ...
Etienne de Martel
7
Das NullPointerExceptionwird während des Unboxing von Integerinint
Colin Hebert
Sie werden nicht in ein Int umgewandelt, kein Objekt kann jemals in ein Int umgewandelt werden. Sie sind eigentlich zu Integer und dann Autoboxing zu einem int.
Steve Kuo
1
@ Steve Kuo, Yep, genau das was ich sage. Deshalb habe ich das Wort "Besetzung" nicht verwendet.
Colin Hebert
@Etienne: Sie können ein Null-Objekt in eine Ganzzahl umwandeln und so eine Null-Ganzzahl erhalten. Wenn Sie jedoch versuchen, das int daraus zu extrahieren, erhalten Sie eine Nullzeigerausnahme. Es gibt kein "null int".
Jay
18

Angenommen, das Objekt ist ein IntegerObjekt, dann können Sie Folgendes tun:

int i = ((Integer) obj) .intValue ();

Wenn das Objekt kein IntegerObjekt ist, müssen Sie den Typ erkennen und basierend auf seinem Typ konvertieren.

Erick Robertson
quelle
Wenn obj null ist, wird eine NullPointerException ausgelöst.
Colin Hebert
und eine ClassCastException, wenn es sich nicht um ein Integer-Objekt handelt.
Erick Robertson
1
Keine Notwendigkeit, intValuefür Autoboxing aufzurufen, wird es für Sie aufrufen.
OscarRyz
1
intValueist viel klarer, vor allem angesichts der Verwirrung der Anfänger zwischen intaustauschbar mit Integer.
Steve Kuo
14

Szenario 1: einfacher Fall

Wenn garantiert ist, dass Ihr Objekt ein Objekt ist Integer, ist dies der einfache Weg:

int x = (Integer)yourObject;

Szenario 2: ein beliebiges numerisches Objekt

In Java Integer, Long, BigIntegerimplementieren usw. alle NumberSchnittstelle , die eine Methode mit dem Namen hat intValue. Alle anderen benutzerdefinierten Typen mit einem numerischen Aspekt sollten ebenfalls implementiert werden Number(zum Beispiel :) Age implements Number. Also kannst du:

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

Szenario 3: Analysieren Sie numerischen Text

Wenn Sie Benutzereingaben über die Befehlszeile (oder ein Textfeld usw.) akzeptieren, erhalten Sie diese als String. In diesem Fall können Sie verwenden Integer.parseInt(String string):

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

Wenn Sie eine Eingabe als erhalten Object, können Sie Folgendes verwenden (String)inputoder, wenn es einen anderen Texttyp haben kann input.toString():

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

Szenario 4: Identitäts-Hash

In Java gibt es keine Zeiger. Hat Objectjedoch eine zeigerähnliche Standardimplementierung für hashCode(), die direkt über verfügbar ist System.identityHashCode(Object o). Also kannst du:

int x = System.identityHashCode(yourObject);

Beachten Sie, dass dies kein echter Zeigerwert ist. Die Speicheradresse von Objekten kann von der JVM geändert werden, während ihre Identitäts-Hashes beibehalten werden. Außerdem können zwei lebende Objekte denselben Identitäts-Hash haben.

Sie können auch verwenden object.hashCode(), es kann jedoch typspezifisch sein.

Szenario 5: eindeutiger Index

In den gleichen Fällen benötigen Sie einen eindeutigen Index für jedes Objekt, z. B. um automatisch inkrementierte ID-Werte in einer Datenbanktabelle (und im Gegensatz zu Identitäts-Hashs, die nicht eindeutig sind). Eine einfache Beispielimplementierung hierfür:

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

}

Verwendung:

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

Szenario 6: Mitglied auflisten

In Java sind Enum-Mitglieder keine Ganzzahlen, sondern Objekte mit vollem Funktionsumfang (im Gegensatz zu beispielsweise C / C ++). Wahrscheinlich ist es nie erforderlich, ein Enum-Objekt in zu konvertieren. intJava ordnet jedoch jedem Enum-Mitglied automatisch eine Indexnummer zu. Auf diesen Index kann beispielsweise zugegriffen werden über Enum.ordinal():

enum Foo { BAR, BAZ, QUX }

// ...

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

Geben Sie hier die Bildbeschreibung ein

Dávid Horváth
quelle
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");
    }
}

Wie Sie sehen können, ist dies keine sehr effiziente Methode. Sie müssen nur sicher sein, welche Art von Objekt Sie haben. Konvertieren Sie es dann richtig in ein int.

Martijn Courteaux
quelle
Ist es nicht @Deprecated (e anstelle von a)? :) Gute Methode, macht keine Annahmen über den Typ des Objekts.
extraneon
Übrigens berücksichtigt Ihre Regex weder Radix Hex noch Oct. ToInt ist eine intelligente Methode. Versuchen Sie besser, NumberFormatExcepytion zu fangen.
extraneon
4

Sie müssen es in eine Ganzzahl (int's Wrapper-Klasse) umwandeln. Sie können dann die intValue () -Methode von Integer verwenden, um das innere int zu erhalten.

Etienne de Martel
quelle
4

Antworten:

int i = ( Integer ) yourObject;

Wenn Ihr Objekt bereits eine Ganzzahl ist, läuft es reibungslos. dh:

Object yourObject = 1;
//  cast here

oder

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

etc.

Wenn Ihr Objekt etwas anderes ist, müssen Sie es (wenn möglich) zuerst in ein int konvertieren:

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

Oder

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

Ich verwende einen Einzeiler bei der Verarbeitung von Daten von GSON:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;
Irgendwer irgendwo
quelle
Es ist ein langwieriger Prozess. Führen Sie einfach (int) Object anstelle von Double.valueOf (object.toString ()). IntValue () aus . Das funktioniert nur für Zahlen, das haben wir gebraucht.
Sudhakar Krishnan
1
@SudhakarK: (int) Objekt funktioniert nur, wenn Ihr Objekt eine Ganzzahl ist. Dieser Oneliner unterstützt auch String-Nummern. EG "332".
Jacob van Lingen
2

Wenn das Objectursprünglich als instanziiert wurde Integer, können Sie es intmit dem Cast-Operator auf ein Downcast übertragen (Subtype).

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

Beachten Sie, dass dies nur funktioniert , wenn Sie verwenden mindestens Java 1.5 mit Autoboxing - Funktion , sonst muss man erklären , iwie Integerstatt und rufen Sie dann intValue()auf sie .

Aber wenn es ursprünglich überhaupt nicht als erstellt wurde Integer, kann man so nicht niederschlagen. Dies würde zu einem ClassCastExceptionmit dem ursprünglichen Klassennamen in der Nachricht führen. Wenn die toString()Objektdarstellung als erhalten String#valueOf()bezeichnet eine syntaktisch gültige ganze Zahl (zB nur Ziffern, ggf. mit einem Minuszeichen vor), dann können Sie verwenden , Integer#valueOf()oder new Integer()für diese.

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

Siehe auch:

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

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

Kann nicht gemacht werden. An intist kein Objekt, es ist ein primitiver Typ. Sie können es in Integer umwandeln und dann das int erhalten.

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

 int num = i; //Java 1.5 or higher
Tom
quelle
Dies setzt voraus, dass das Objekt eine Ganzzahl ist, die es mit ziemlicher Sicherheit nicht ist. Wahrscheinlich wollen wir die String-Lösung ala Coronauts
Bill K
Wie könnte es kompiliert werden, wenn Sie ein Objekt in Object umwandeln und dann versuchen, es auf eine Integer-Variable zu setzen?
Carlos
2

Das kannst du nicht. Ein intist kein Object.

Integerist ein Objectobwohl, aber ich bezweifle, dass du das meinst.

Extraneon
quelle
Es gibt Auto-Boxen / Unboxing seit Java 5.
Bruno
@Bruno: Du kannst ein Objekt nicht in einen Int umwandeln. Sie können ein Objekt in eine Ganzzahl umwandeln und es dann einem Int zuweisen, und es wird auf magische Weise automatisch aktiviert. Sie können ein Objekt jedoch nicht in ein Int umwandeln.
Jay
(Fortsetzung) Persönlich denke ich, dass die Leute viel schlechten Code erstellen, der auf Autoboxing basiert. Ich habe neulich eine Anweisung gesehen: "Double amount = (Double.parseDouble (stringAmount)). DoubleValue ();". Das heißt, er analysierte einen String, um ein Doppelprimitiv zu erhalten, und führte dann eine Funktion gegen dieses aus, die den Compiler zwang, es automatisch in ein Double-Objekt zu kopieren. Die Funktion war jedoch doubleValue, das das Doppelprimitiv extrahierte, das er dann einem Double zuordnete Objekt, wodurch eine Autobox erzwungen wird. Das heißt, er konvertierte von primitiv zu Objekt zu primitiv zu Objekt, 3 Konvertierungen.
Jay
@ Jay, stimmte dem 1. Kommentar zu (sorry, ich war selbst nicht klar). In Bezug auf zu viele Konvertierungen haben Sie auch Recht, aber ich habe den Eindruck, dass der JIT-Compiler damit recht gut umgehen kann, sodass es in der Praxis nicht so wichtig sein sollte (das macht es nicht unbedingt zu einer Entschuldigung für schlechten Code ...)
Bruno
1
@Bruno Das Trick-Teil des Autoboxing, das unerwartete NullPointerExceptions hervorrufen kann.
extraneon
1

Wenn Sie meinen, einen String in int umzuwandeln, verwenden Sie Integer.valueOf("123").

Sie können die meisten anderen Objekte jedoch nicht in int umwandeln, da sie keinen int-Wert haben. Beispielsweise hat ein XmlDocument keinen int-Wert.

Amy B.
quelle
1
Verwenden Integer.valueOf("123")Sie diese Option nicht, wenn Sie lediglich ein Grundelement benötigen, Integer.parseInt("123")da die valueOf- Methode ein unnötiges Unboxing verursacht.
Kerem Baydoğan
1

Ich denke, Sie fragen sich, warum Sie mit C oder C ++ einen Objektzeiger wie eine Zahl bearbeiten können, aber Sie können eine Objektreferenz in Java nicht auf die gleiche Weise bearbeiten.

Objektreferenzen in Java sind nicht wie Zeiger in C oder C ++ ... Pointers im Grunde sind ganze Zahlen und Sie können sie wie jede andere int manipulieren. Referenzen sind absichtlich eine konkretere Abstraktion und können nicht wie Zeiger manipuliert werden.

Romacafe
quelle
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

Dieser Code zeigt, warum ArrayListwichtig ist und warum wir ihn verwenden. Einfach Gießen intaus Object. Kann hilfreich sein.

Mahbubur Rahman Khan
quelle
Bitte erklären Sie Ihre Antwort
Gwenc37
1

Zum Beispiel Objektvariable; hastaId

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

Zum Beispiel ein Objekt in ein int umwandeln,hastaID

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

Siehe diesen Code:

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);
  }
}
Vishal Tathe
quelle
0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;
Nehal Pawar
quelle
Dies zeigt eine Situation, in der das Casting erforderlich ist, und ich werde auch den Fehler hinzufügen, der in dieser Situation tatsächlich auftritt. Es ist schwierig für einen neuen Codierer, die tatsächliche Implementierung herauszufinden, wenn es kein Beispiel gibt. Ich hoffe, dieses Beispiel hilft ihnen
Nehal Pawar
0

Schließlich wurde die beste Implementierung für Ihre Spezifikation gefunden.

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

Überprüfen Sie zuerst mit dem Schlüsselwort instanceof. Wenn es wahr ist, dann wirf es.

Toter Programmierer
quelle
Ich habe dies verwendet und frage mich jetzt, wie ich den 'Boxed-Wert wird entpackt und dann sofort neu verpackt' in dieser Zeile lösen kann. (Aufgrund von Spotbugs-Checks) Jetzt frage ich mich, wie ich es besser lösen kann.
Jasper Lankhorst