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:
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.
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.
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:
ObjectIndexer indexer =newObjectIndexer();int x = indexer.indexFor(yourObject);// 1int y = indexer.indexFor(newObject());// 2int 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():
enumFoo{ BAR, BAZ, QUX }// ...Object baz =Foo.BAZ;int index =((Enum)baz).ordinal();// 1
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.
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.
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 =newInteger(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));
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.
@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.
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.
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
Dieser Code zeigt, warum ArrayListwichtig ist und warum wir ihn verwenden. Einfach Gießen intaus Object. Kann hilfreich sein.
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.
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.
Object
nicht der Fall istInteger
, bin ich mir nicht sicher, was Sie von Ihrer Besetzung erwarten.intValue
), einen Konstruktor für Ihre Aufzählung erstellen, der die festlegtintValue
, Ihre Aufzählungskonstanten diesen Konstruktor aufrufen lassen und einen Getter hinzufügen fürintValue
. Rufen Sie dann den Getter an, anstatt zu wirken.Antworten:
Wenn Sie sicher sind, dass dieses Objekt ein
Integer
:Ab Java 7 können Sie auch gleichwertig schreiben:
Achtung, es kann ein werfen,
ClassCastException
wenn Ihr Objekt kein istInteger
und ein,NullPointerException
wenn Ihr Objekt istnull
.Auf diese Weise nehmen Sie an, dass Ihr Objekt eine Ganzzahl (das umschlossene Int) ist, und entpacken es in ein Int.
int
ist ein Grundelement, daher kann es nicht als gespeichert werdenObject
. Die einzige Möglichkeit besteht darin, einint
als / betrachtet undInteger
dann als gespeichert zu habenObject
.Wenn Ihr Objekt a ist
String
, können Sie es mithilfe derInteger.valueOf()
Methode in ein einfaches int konvertieren:Es kann ein werfen,
NumberFormatException
wenn Ihr Objekt nicht wirklich einString
mit einer Ganzzahl als Inhalt ist.Ressourcen:
Zum gleichen Thema:
quelle
NullPointerException
wird während des Unboxing vonInteger
inint
Angenommen, das Objekt ist ein
Integer
Objekt, dann können Sie Folgendes tun:Wenn das Objekt kein
Integer
Objekt ist, müssen Sie den Typ erkennen und basierend auf seinem Typ konvertieren.quelle
intValue
für Autoboxing aufzurufen, wird es für Sie aufrufen.intValue
ist viel klarer, vor allem angesichts der Verwirrung der Anfänger zwischenint
austauschbar mitInteger
.Szenario 1: einfacher Fall
Wenn garantiert ist, dass Ihr Objekt ein Objekt ist
Integer
, ist dies der einfache Weg:Szenario 2: ein beliebiges numerisches Objekt
In Java
Integer
,Long
,BigInteger
implementieren usw. alleNumber
Schnittstelle , die eine Methode mit dem Namen hatintValue
. Alle anderen benutzerdefinierten Typen mit einem numerischen Aspekt sollten ebenfalls implementiert werdenNumber
(zum Beispiel :)Age implements Number
. Also kannst du: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 verwendenInteger.parseInt(String string)
:Wenn Sie eine Eingabe als erhalten
Object
, können Sie Folgendes verwenden(String)input
oder, wenn es einen anderen Texttyp haben kanninput.toString()
:Szenario 4: Identitäts-Hash
In Java gibt es keine Zeiger. Hat
Object
jedoch eine zeigerähnliche Standardimplementierung fürhashCode()
, die direkt über verfügbar istSystem.identityHashCode(Object o)
. Also kannst du: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:
Verwendung:
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.
int
Java ordnet jedoch jedem Enum-Mitglied automatisch eine Indexnummer zu. Auf diesen Index kann beispielsweise zugegriffen werden überEnum.ordinal()
:quelle
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.
quelle
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.
quelle
Antworten:
Wenn Ihr Objekt bereits eine Ganzzahl ist, läuft es reibungslos. dh:
oder
etc.
Wenn Ihr Objekt etwas anderes ist, müssen Sie es (wenn möglich) zuerst in ein int konvertieren:
Oder
quelle
Ich verwende einen Einzeiler bei der Verarbeitung von Daten von GSON:
quelle
Wenn das
Object
ursprünglich als instanziiert wurdeInteger
, können Sie esint
mit dem Cast-Operator auf ein Downcast übertragen(Subtype)
.Beachten Sie, dass dies nur funktioniert , wenn Sie verwenden mindestens Java 1.5 mit Autoboxing - Funktion , sonst muss man erklären ,
i
wieInteger
statt und rufen Sie dannintValue()
auf sie .Aber wenn es ursprünglich überhaupt nicht als erstellt wurde
Integer
, kann man so nicht niederschlagen. Dies würde zu einemClassCastException
mit dem ursprünglichen Klassennamen in der Nachricht führen. Wenn dietoString()
Objektdarstellung als erhaltenString#valueOf()
bezeichnet eine syntaktisch gültige ganze Zahl (zB nur Ziffern, ggf. mit einem Minuszeichen vor), dann können Sie verwenden ,Integer#valueOf()
odernew Integer()
für diese.Siehe auch:
quelle
quelle
Kann nicht gemacht werden. An
int
ist kein Objekt, es ist ein primitiver Typ. Sie können es in Integer umwandeln und dann das int erhalten.quelle
Das kannst du nicht. Ein
int
ist keinObject
.Integer
ist einObject
obwohl, aber ich bezweifle, dass du das meinst.quelle
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.
quelle
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.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.
quelle
Dieser Code zeigt, warum
ArrayList
wichtig ist und warum wir ihn verwenden. Einfach Gießenint
ausObject
. Kann hilfreich sein.quelle
Zum Beispiel Objektvariable;
hastaId
Zum Beispiel ein Objekt in ein int umwandeln,
hastaID
quelle
Siehe diesen Code:
quelle
quelle
Schließlich wurde die beste Implementierung für Ihre Spezifikation gefunden.
quelle
Überprüfen Sie zuerst mit dem Schlüsselwort instanceof. Wenn es wahr ist, dann wirf es.
quelle