Comment convertir un objet en un int

221

Comment puis-je convertir un objet en un int en java?

Sheehan Alam
la source
6
Que veux tu vraiment faire? Si ce Objectn'est pas le cas Integer, je ne sais pas ce que vous attendez de votre casting.
unholysampler
2
vérifiez d'abord avec le mot-clé instanceof. si vrai, jetez-le.
Programmeur mort le
Aww. Je voulais juste que les membres enum soient convertis en valeurs entières spécifiques, afin de pouvoir avoir des énumérations pour les constantes winapi. msdn.microsoft.com/en-us/library/windows/desktop/…
Tomáš Zato - Reinstate Monica
@ TomášZato Vous pouvez le faire (en quelque sorte), il suffit de définir un champ dans votre énumération pour contenir la valeur entière (par exemple intValue), de créer un constructeur pour votre énumération qui définit le intValue, de faire en sorte que vos constantes énumératives invoquent ce constructeur et d'ajouter un getter pour intValue. Ensuite, au lieu de lancer, appelez le getter.
Brian McCutchon

Réponses:

385

Si vous êtes sûr que cet objet est un Integer:

int i = (Integer) object;

Ou, à partir de Java 7, vous pouvez écrire de manière équivalente:

int i = (int) object;

Attention, il peut lancer un ClassCastExceptionsi votre objet n'est pas un Integeret un NullPointerExceptionsi votre objet l'est null.

De cette façon, vous supposez que votre objet est un entier (l'int encapsulé) et vous le déballez dans un int.

intest une primitive donc elle ne peut pas être stockée en tant que Object, la seule façon est d'avoir un intconsidéré / encadré en tant que Integerpuis stocké en tant que Object.


Si votre objet est un String, vous pouvez utiliser la Integer.valueOf()méthode pour le convertir en un simple int:

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

Il peut lancer un NumberFormatExceptionsi votre objet n'est pas vraiment un Stringavec un entier comme contenu.


Ressources :

Sur le même sujet:

Colin Hebert
la source
Êtes-vous sûr de l'exception NullPointerException? Je pensais qu'un objet nul donnerait juste un entier nul ....
Etienne de Martel
7
Le NullPointerExceptionse produira lors du déballage de Integerintoint
Colin Hebert
Vous ne transformez pas en entier, aucun objet ne peut jamais être converti en entier. Vous êtes en fait sur Integer, puis sur Autoboxing vers un int.
Steve Kuo
1
@Steve Kuo, oui, exactement ce que je dis. C'est pourquoi je n'ai pas utilisé le mot "cast".
Colin Hebert
@Etienne: Vous pouvez convertir un objet nul en un entier, obtenant ainsi un entier nul. Mais lorsque vous essayez d'en extraire l'int, vous obtiendrez une exception de pointeur nul. Il n'y a rien de tel qu'un "null int".
Jay
18

En supposant que l'objet est un Integerobjet, vous pouvez alors faire ceci:

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

Si l'objet n'est pas un Integerobjet, vous devez détecter le type et le convertir en fonction de son type.

Erick Robertson
la source
Si obj est nul, il lèvera une NullPointerException.
Colin Hebert
et une ClassCastException si ce n'est pas un objet Integer.
Erick Robertson
1
Inutile d'appeler intValuepour l'autoboxing l'invoquera pour vous.
OscarRyz
1
intValueest beaucoup plus clair, surtout compte tenu de la confusion débutante entre intêtre interchangeable avec Integer.
Steve Kuo
14

Scénario 1: cas simple

S'il est garanti que votre objet est un Integer, voici le moyen simple:

int x = (Integer)yourObject;

Scénario 2: tout objet numérique

En Java Integer, Long, BigIntegeretc. mettre en œuvre toute l' Numberinterface qui a une méthode nommée intValue. Tout autre type personnalisé avec un aspect numérique doit également être implémenté Number(par exemple:) Age implements Number. Afin que vous puissiez:

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

Scénario 3: analyser du texte numérique

Lorsque vous acceptez l'entrée utilisateur à partir de la ligne de commande (ou du champ de texte, etc.), vous l'obtenez en tant que String. Dans ce cas, vous pouvez utiliser Integer.parseInt(String string):

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

Si vous obtenez l' entrée comme Object, vous pouvez utiliser (String)input, ou, si elle peut avoir un autre type textuel, input.toString():

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

Scénario 4: hachage d'identité

En Java, il n'y a pas de pointeurs. Cependant, Objecta une implémentation par défaut de type pointeur pour hashCode(), qui est directement disponible via System.identityHashCode(Object o). Afin que vous puissiez:

int x = System.identityHashCode(yourObject);

Notez que ce n'est pas une vraie valeur de pointeur. L'adresse mémoire des objets peut être modifiée par la JVM pendant que leurs hachages d'identité sont conservés. De plus, deux objets vivants peuvent avoir le même hachage d'identité.

Vous pouvez également l'utiliser object.hashCode(), mais il peut être spécifique au type.

Scénario 5: index unique

Dans les mêmes cas, vous avez besoin d'un index unique pour chaque objet, comme pour les valeurs d'ID incrémentées automatiquement dans une table de base de données (et contrairement au hachage d'identité qui n'est pas unique). Un exemple d'implémentation simple pour cela:

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

}

Usage:

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

Scénario 6: membre enum

En Java, les membres enum ne sont pas des entiers mais des objets complets (contrairement à C / C ++, par exemple). Il n'est probablement jamais nécessaire de convertir un objet enum en int, mais Java associe automatiquement un numéro d'index à chaque membre enum. Cet index est accessible via Enum.ordinal(), par exemple:

enum Foo { BAR, BAZ, QUX }

// ...

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

entrez la description de l'image ici

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

Comme vous pouvez le voir, ce n'est pas une manière très efficace de le faire. Vous devez simplement être sûr du type d'objet que vous possédez. Ensuite, convertissez-le en int de la bonne façon.

Martijn Courteaux
la source
N'est-ce pas @Deprecated (e au lieu de a)? :) Belle méthode cependant, ne fait aucune hypothèse sur le type de l'objet.
extraneon du
Soit dit en passant, votre expression régulière ne prend pas en compte les radix hex ou oct. ToInt est une méthode intelligente. Mieux vaut essayer d'attraper NumberFormatExcepytion.
extraneon le
4

Vous devez le convertir en un Integer (classe wrapper int). Vous pouvez ensuite utiliser la méthode intValue () d'Integer pour obtenir l'int int.

Etienne de Martel
la source
4

Répondre:

int i = ( Integer ) yourObject;

Si votre objet est déjà un entier, il fonctionnera sans problème. c'est à dire:

Object yourObject = 1;
//  cast here

ou

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

etc.

Si votre objet est autre chose, vous devrez d'abord le convertir (si possible) en entier:

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

Ou

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

J'utilise une doublure lors du traitement des données de GSON:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;
Quelqu'un quelque part
la source
C'est un long processus. Il suffit de faire (int) Object au lieu de Double.valueOf (object.toString ()). IntValue () . Cela ne fonctionne que pour les chiffres, c'est ce dont nous avions besoin.
Sudhakar Krishnan
1
@SudhakarK: (int) L'objet ne fonctionne que si votre objet est un entier. Cet oneliner prend également en charge les numéros de chaîne; EG "332".
Jacob van Lingen
2

Si le a Objectété à l'origine instancié en tant que Integer, vous pouvez le convertir en un intà l'aide de l'opérateur de conversion (Subtype).

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

Notez que cela ne fonctionne que lorsque vous utilisez au moins Java 1.5 avec fonction autoboxing , sinon vous devez déclarer icomme Integerlieu puis appelez intValue()là - dessus .

Mais si au départ il n'a pas été créé en tant que Integerdu tout, alors vous ne pouvez pas abattre comme ça. Il en résulterait un ClassCastExceptionavec le nom de classe d'origine dans le message. Si la toString()représentation de l'objet obtenue par String#valueOf()dénote un nombre entier syntaxiquement valide (par exemple des chiffres uniquement, si nécessaire avec un signe moins devant), alors vous pouvez utiliser Integer#valueOf()ou new Integer()pour cela.

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

Voir également:

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

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

Impossible. An intn'est pas un objet, c'est un type primitif. Vous pouvez le lancer sur Integer, puis obtenir l'int.

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

 int num = i; //Java 1.5 or higher
À M
la source
Cela suppose que l'objet est un entier, ce qu'il n'est presque certainement pas. Je veux probablement la solution des cordes ala Coronauts
Bill K
Comment pourrait-il se compiler lorsque vous transformez un objet en objet, puis essayez de le définir sur une variable entière.
Carlos
2

Tu ne peux pas. Un intn'est pas un Object.

Integerest un Objectbien, mais je doute que c'est ce que vous voulez dire.

extranéon
la source
Il y a de la boxe / décompression automatique depuis Java 5.
Bruno
@Bruno: Vous ne pouvez pas convertir un objet en un int. Vous pouvez lancer un objet sur un entier, puis l'affecter à un int et il sera automatiquement mis en boîte automatique. Mais vous ne pouvez pas convertir un objet en un int.
Jay
(suite) Personnellement, je pense que les gens créent beaucoup de mauvais code en se basant sur l'autoboxing. Comme, j'ai vu une déclaration l'autre jour, "Double amount = (Double.parseDouble (stringAmount)). DoubleValue ();". Autrement dit, il a analysé une chaîne pour obtenir une double primitive, puis a exécuté une fonction par rapport à cela, ce qui a forcé le compilateur à le placer automatiquement dans un objet Double, mais la fonction était doubleValue qui a extrait la double primitive, qu'il a ensuite affectée à une Double objet forçant ainsi une boîte automatique. C'est-à-dire qu'il a converti de primitif en objet en primitif en objet, 3 conversions.
Jay
@Jay, d'accord sur le 1er commentaire (désolé, je n'ai pas été clair moi-même). En ce qui concerne trop de conversion, vous avez raison aussi, mais j'ai l'impression que le compilateur JIT peut très bien y faire face, donc cela ne devrait pas trop d'importance dans la pratique (cela ne fait pas nécessairement une excuse pour un mauvais code ...)
Bruno
1
@Bruno La partie piège de l'autoboxing qui peut vous donner des NullPointerExceptions inattendues.
extraneon du
1

Si vous voulez convertir une chaîne en entier, utilisez Integer.valueOf("123") .

Cependant, vous ne pouvez pas convertir la plupart des autres objets en int, car ils n'auront pas de valeur int. Par exemple, un XmlDocument n'a pas de valeur int.

Amy B
la source
1
N'utilisez pas Integer.valueOf("123")si tout ce dont vous avez besoin est une primitive, utilisez plutôt Integer.parseInt("123")car la méthode valueOf provoque un déballage inutile.
Kerem Baydoğan
1

Je suppose que vous vous demandez pourquoi C ou C ++ vous permet de manipuler un pointeur d'objet comme un nombre, mais vous ne pouvez pas manipuler une référence d'objet en Java de la même manière.

Les références aux objets en Java ne sont pas comme des pointeurs en C ou C ++ ... Les pointeurs sont essentiellement des entiers et vous pouvez les manipuler comme n'importe quel autre int. Les références sont intentionnellement une abstraction plus concrète et ne peuvent pas être manipulées comme le peuvent les pointeurs.

romacafe
la source
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

Ce code montre pourquoi ArrayListest important et pourquoi nous l'utilisons. Lancer simplement à intpartir de Object. Peut être utile.

Mahbubur Rahman Khan
la source
Veuillez expliquer votre réponse
Gwenc37
1

Pour l'exemple de variable d'objet; hastaId

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

Par exemple, Cast un objet en un int,hastaID

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

Référez-vous à ce 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
la source
0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;
Nehal Pawar
la source
Cela montre une situation où le casting est requis et j'ajouterai également l'erreur qui apparaît réellement avec cette situation. Il est difficile pour un nouveau codeur de comprendre l'implémentation réelle s'il n'y a pas d'exemple. J'espère que cet exemple les aidera
Nehal Pawar
0

Enfin, la meilleure implémentation pour votre spécification a été trouvée.

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

vérifiez d'abord avec le mot-clé instanceof. si vrai, jetez-le.

Programmeur mort
la source
J'ai utilisé cela et maintenant je me demande comment résoudre la `` valeur en boîte n'est pas en boîte, puis immédiatement en boîte '' sur cette ligne. (En raison des vérifications de spots), maintenant je me demande comment mieux le résoudre.
Jasper Lankhorst