Cómo lanzar un objeto a un int

221

¿Cómo puedo lanzar un objeto a un int en Java?

Sheehan Alam
fuente
66
¿Qué quieres hacer realmente? Si Objectno es un Integer, no estoy seguro de lo que esperas de tu elenco.
unholysampler
2
primero verifique con la palabra clave instanceof. si es verdad, entonces tíralo.
Programador muerto el
Aww. Solo quería tener miembros de enumeración para emitir a valores enteros específicos, de modo que pueda tener enumeraciones para constantes winapi. msdn.microsoft.com/en-us/library/windows/desktop/…
Tomáš Zato - Restablece a Monica el
@ TomášZato Puede hacer eso (más o menos), simplemente defina un campo en su enumeración para mantener el valor entero (digamos intValue), cree un constructor para su enumeración que establezca intValue, haga que sus constantes de enumeración invoquen ese constructor y agregue un getter para intValue. Luego, en lugar de lanzar, llame al captador.
Brian McCutchon

Respuestas:

385

Si está seguro de que este objeto es un Integer:

int i = (Integer) object;

O, a partir de Java 7, puede escribir de manera equivalente:

int i = (int) object;

Cuidado, puede arrojar un ClassCastExceptionsi su objeto no es un Integery un NullPointerExceptionsi su objeto es null.

De esta manera, asume que su objeto es un entero (el int envuelto) y lo desempaqueta en un int.

intes un primitivo, por lo que no se puede almacenar como un Object, la única forma es tener un intconsiderado / encuadrado como Integerluego almacenado como un Object.


Si su objeto es un String, entonces puede usar el Integer.valueOf()método para convertirlo en un int simple:

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

Puede arrojar un NumberFormatExceptionsi su objeto no es realmente Stringun número entero como contenido.


Recursos:

Sobre el mismo tema:

Colin Hebert
fuente
¿Estás seguro de la NullPointerException? Pensé que un objeto nulo produciría un entero nulo ...
Etienne de Martel
77
El NullPointerExceptionocurrirá durante el unboxing de Integerenint
Colin Hebert
No estás lanzando a un int, ningún objeto puede ser lanzado a un int. En realidad estás en Integer y luego autoboxing a un int.
Steve Kuo
1
@ Steve Kuo, sí, exactamente lo que estoy diciendo. Es por eso que no usé la palabra "cast".
Colin Hebert
@ Etienne: puedes lanzar un objeto nulo a un entero, obteniendo así un entero nulo. Pero cuando intente extraer el int de él, obtendrá una excepción de puntero nulo. No existe tal cosa como un "null int".
Jay
18

Asumiendo que el objeto es un Integer objeto, puede hacer esto:

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

Si el objeto no es un Integerobjeto, debe detectar el tipo y convertirlo en función de su tipo.

Erick Robertson
fuente
Si obj es nulo, arrojará una NullPointerException.
Colin Hebert
y una ClassCastException si no es un objeto Integer.
Erick Robertson
1
No es necesario invocar intValuepara autoboxing lo invocará por usted.
OscarRyz
1
intValuees mucho más claro, especialmente teniendo en cuenta la confusión del principiante entre intser intercambiable con Integer.
Steve Kuo
14

Escenario 1: caso simple

Si se garantiza que su objeto es un Integer, esta es la manera simple:

int x = (Integer)yourObject;

Escenario 2: cualquier objeto numérico

En Java Integer, etc. Long, BigIntegertodos implementan la Numberinterfaz que tiene un método llamado intValue. También debe implementarse cualquier otro tipo personalizado con un aspecto numérico Number(por ejemplo:) Age implements Number. Así que puedes:

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

Escenario 3: analizar texto numérico

Cuando acepta la entrada del usuario desde la línea de comando (o campo de texto, etc.), la obtiene como a String. En este caso puedes usar Integer.parseInt(String string):

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

Si usted recibe como entrada Object, se puede utilizar (String)input, o, si se puede tener un otro tipo textual, input.toString():

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

Escenario 4: hash de identidad

En Java no hay punteros. Sin embargo, Objecttiene una implementación predeterminada similar a un puntero para hashCode(), que está directamente disponible a través de System.identityHashCode(Object o). Así que puedes:

int x = System.identityHashCode(yourObject);

Tenga en cuenta que esto no es un valor de puntero real. La dirección de memoria de los objetos puede ser cambiada por la JVM mientras se mantienen sus hashes de identidad. Además, dos objetos vivos pueden tener el mismo hash de identidad.

También puedes usar object.hashCode() , pero puede ser específico del tipo.

Escenario 5: índice único

En los mismos casos, necesita un índice único para cada objeto, como aumentar automáticamente los valores de ID en una tabla de base de datos (y a diferencia del hash de identidad que no es único). Una implementación de muestra simple para esto:

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

}

Uso:

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

Escenario 6: miembro enum

En Java, los miembros de enumeración no son enteros, sino objetos con todas las funciones (a diferencia de C / C ++, por ejemplo). Probablemente nunca sea necesario convertir un objeto enum int, sin embargo, Java asocia automáticamente un número de índice a cada miembro enum. Se puede acceder a este índice a través de Enum.ordinal(), por ejemplo:

enum Foo { BAR, BAZ, QUX }

// ...

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

ingrese la descripción de la imagen aquí

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

Como puede ver, esta no es una forma muy eficiente de hacerlo. Simplemente tienes que estar seguro de qué tipo de objeto tienes. Luego conviértalo a int de la manera correcta.

Martijn Courteaux
fuente
¿No es @Deprecated (e en lugar de a)? :) Buen método, sin embargo, no hace suposiciones sobre el tipo de objeto.
Extraneon
Por cierto, tu expresión regular no tiene en cuenta la raíz hexagonal u oct. ToInt es un método inteligente. Apuesta a intentar atrapar NumberFormatExcepytion.
Extraneon
4

Tienes que convertirlo en un entero (clase de contenedor de int). Luego puede usar el método intValue () de Integer para obtener el int interno.

Etienne de Martel
fuente
4

Responder:

int i = ( Integer ) yourObject;

Si su objeto ya es un entero, se ejecutará sin problemas. es decir:

Object yourObject = 1;
//  cast here

o

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

etc.

Si su objeto es otra cosa, primero deberá convertirlo (si es posible) a un int:

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

O

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

Yo uso una línea cuando proceso datos de GSON:

int i = object != null ? Double.valueOf(object.toString()).intValue() : 0;
Alguien en algún lugar
fuente
Es un proceso largo. Simplemente haga (int) Object en lugar de Double.valueOf (object.toString ()). IntValue () . Esto funciona solo para números, eso es lo que necesitábamos.
Sudhakar Krishnan
1
@SudhakarK: (int) El objeto solo funciona si tu objeto es un número entero. Este oneliner también admite números de cadena; EG "332".
Jacob van Lingen
2

Si Objectoriginalmente se creó una instancia de como Integer, entonces puede bajarlo a intusando el operador de conversión (Subtype).

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

Tenga en cuenta que esto sólo funciona cuando se está utilizando al menos Java 1.5 con función autoboxing , de lo contrario se tiene que declarar icomo Integerlugar y luego llama intValue()en ella .

Pero si inicialmente no se creó como un Integerabsoluto, entonces no se puede abatir así. Resultaría en un ClassCastExceptioncon el nombre de clase original en el mensaje. Si la toString()representación del objeto obtenida por String#valueOf()denota un número entero sintácticamente válido (por ejemplo, solo dígitos, si es necesario con un signo menos al frente), puede usar Integer#valueOf()o new Integer()para esto.

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

Ver también:

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

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

No se puede hacer An intno es un objeto, es un tipo primitivo. Puedes enviarlo a Integer y luego obtener el int.

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

 int num = i; //Java 1.5 or higher
Tom
fuente
Esto supone que el objeto es un número entero que casi seguro que no lo es. Probablemente quiere la solución de cuerdas ala Coronauts
Bill K
¿Cómo podría compilarse cuando está convirtiendo un objeto en un Objeto y luego tratando de establecerlo en una variable Integer?
Carlos
2

No puedes An intno es un Object.

Integeres un Objectpensamiento, pero dudo que sea eso lo que quieres decir.

extraneon
fuente
Hay auto boxing / unboxing desde Java 5.
Bruno
@Bruno: No puedes lanzar un Objeto a un int. Puede lanzar un Objeto a un Entero y luego asignarlo a un int y mágicamente se autoempaquetará. Pero no puedes lanzar un objeto a un int.
Jay
(continuación) Personalmente, creo que la gente crea un montón de código incorrecto basándose en el autoboxing. Como, vi una declaración el otro día, "Cantidad doble = (Double.parseDouble (stringAmount)). DoubleValue ();". Es decir, analizó una Cadena para obtener una primitiva doble, luego ejecutó una función contra esto, lo que obligó al compilador a autoboxearlo en un objeto Doble, pero la función fue valor doble que extrajo la primitiva doble, que luego asignó a una Doble objeto forzando así un autobox. Es decir, convirtió de primitivo a objeto a primitivo a objeto, 3 conversiones.
Jay
@ Jay, acepté el primer comentario (lo siento, no estaba claro). Con respecto a demasiadas conversiones, también tiene razón, pero tengo la impresión de que el compilador JIT puede hacer frente a eso bastante bien, por lo que no debería importar tanto en la práctica (eso no necesariamente lo convierte en una excusa para un mal código ...)
Bruno
1
@Bruno La parte difícil de autoboxing es que puede darte NullPointerExceptions inesperadas.
Extraneon
1

Si te refieres a lanzar un String a int, úsalo Integer.valueOf("123").

Sin embargo, no puede lanzar la mayoría de los otros Objetos a int, porque no tendrán un valor int. Por ejemplo, un XmlDocument no tiene valor int.

Amy B
fuente
1
No lo use Integer.valueOf("123")si todo lo que necesita es un primitivo, en su lugar use Integer.parseInt("123")porque el método valueOf causa un unboxing innecesario.
Kerem Baydogan el
1

Supongo que se está preguntando por qué C o C ++ le permiten manipular un puntero de objeto como un número, pero no puede manipular una referencia de objeto en Java de la misma manera.

Las referencias a objetos en Java no son como punteros en C o C ++ ... Los punteros son básicamente enteros y puedes manipularlos como cualquier otro int. Las referencias son intencionalmente una abstracción más concreta y no pueden manipularse de la misma manera que los punteros.

romacafé
fuente
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

Este código muestra por qué ArrayListes importante y por qué lo usamos. Simplemente lanzando intdesde Object. Puede ser útil.

Mahbubur Rahman Khan
fuente
Por favor explique su respuesta
Gwenc37
1

Por ejemplo, objeto variable; hastaId

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

Por ejemplo, lanzar un objeto a un int,hastaID

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

Consulte este código:

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

int divide1 = (Integer) me.getValue()/2;
Nehal Pawar
fuente
Esto muestra una situación en la que se requiere la conversión y también agregaré el error que realmente aparece con esta situación. Es difícil para un nuevo codificador descubrir la implementación real si no hay un ejemplo. Espero que este ejemplo los ayude
Nehal Pawar
0

Finalmente, se encontró la mejor implementación para su especificación.

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

primero verifique con la palabra clave instanceof. si es verdad, entonces tíralo.

Programador muerto
fuente
Utilicé esto y ahora me pregunto cómo resolver el 'El valor del recuadro no está encuadrado y luego se vuelve a encuadrar inmediatamente' en esa línea. (Debido a las comprobaciones de errores), así que ahora me pregunto cómo resolverlo mejor.
Jasper Lankhorst