Come lanciare un oggetto in un int


221

Come posso lanciare un oggetto su un int in Java?


6
Che cosa vuoi veramente fare? Se non lo Objectè Integer, non sono sicuro di cosa ti aspetti dal tuo cast.
unholysampler,

2
controlla prima con la parola chiave instanceof. se vero, lanciarlo.
Dead Programmer

Aww. Volevo solo avere membri enum da trasmettere a valori interi specifici, in modo da poter avere enum per le costanti winapi. msdn.microsoft.com/en-us/library/windows/desktop/…
Tomáš Zato - Ripristina Monica

@ TomášZato Puoi farlo (in un certo senso), basta definire un campo nel tuo enum per contenere il valore intero (diciamo, intValue), creare un costruttore per il tuo enum che lo imposta intValue, fare in modo che le costanti dell'enum invochino quel costruttore e aggiungere un getter per intValue. Quindi, invece di lanciare, chiama il getter.
Brian McCutchon,

Risposte:


385

Se sei sicuro che questo oggetto sia un Integer:

int i = (Integer) object;

Oppure, a partire da Java 7, puoi scrivere equivalentemente:

int i = (int) object;

Attenzione, può lanciare un ClassCastExceptionse il tuo oggetto non è un Integere un NullPointerExceptionse il tuo oggetto lo è null.

In questo modo supponi che il tuo oggetto sia un numero intero (int intrappolato) e lo annulli in un int.

intè una primitiva quindi non può essere memorizzata come un Object, l'unico modo è quello di avere un intconsiderato / inscatolato come un Integerquindi archiviato come un Object.


Se il tuo oggetto è a String, puoi usare il Integer.valueOf()metodo per convertirlo in un semplice int:

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

Può generare un NumberFormatExceptionse il tuo oggetto non è realmente un Stringcon un numero intero come contenuto.


Risorse:

Sullo stesso argomento:


Sei sicuro di NullPointerException? Pensavo che un oggetto null avrebbe prodotto un intero null ...
Etienne de Martel,

7
Il NullPointerExceptionsuccederà durante l'annullamento della boxe Integerinint
Colin Hebert il

Non stai lanciando un int, nessun oggetto può mai essere lanciato in un int. In realtà stai per Integer e quindi il box automatico per un int.
Steve Kuo,

1
@Steve Kuo, sì, esattamente quello che sto dicendo. Ecco perché non ho usato la parola "cast".
Colin Hebert,

@Etienne: puoi lanciare un oggetto null su un intero, ottenendo così un intero nullo. Ma quando provi a estrarre l'int da esso, otterrai un'eccezione puntatore null. Non esiste un "null int".
Jay,

18

Supponendo che l'oggetto sia un Integeroggetto, allora puoi farlo:

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

Se l'oggetto non è un Integeroggetto, devi rilevare il tipo e convertirlo in base al suo tipo.


Se obj è null genererà una NullPointerException.
Colin Hebert,

e ClassCastException se non è un oggetto Integer.
Erick Robertson,

1
Non c'è bisogno di invocare intValueper l'autoboxing lo invocherà per te.
OscarRyz,

1
intValueè molto più chiaro soprattutto considerando la confusione del principiante tra l' intessere intercambiabile con Integer.
Steve Kuo,

14

Scenario 1: caso semplice

Se è garantito che il tuo oggetto è un Integer, questo è il modo semplice:

int x = (Integer)yourObject;

Scenario 2: qualsiasi oggetto numerico

In Java Integer, Long, BigIntegerecc tutti implementano l' Numberinterfaccia che ha un metodo chiamato intValue. Dovrebbero essere implementati anche altri tipi personalizzati con un aspetto numerico Number(ad esempio:) Age implements Number. Così puoi:

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

Scenario 3: analizzare il testo numerico

Quando si accetta l'input dell'utente dalla riga di comando (o campo di testo, ecc.), Si ottiene come String. In questo caso puoi usare Integer.parseInt(String string):

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

Se si ottiene input come Object, è possibile utilizzare (String)input, o, se si può avere un altro tipo testuale, input.toString():

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

Scenario 4: hash identità

In Java non ci sono puntatori. Tuttavia Objectha un'implementazione predefinita simile a un puntatore per hashCode(), che è direttamente disponibile tramite System.identityHashCode(Object o). Così puoi:

int x = System.identityHashCode(yourObject);

Si noti che questo non è un vero valore del puntatore. L'indirizzo di memoria degli oggetti può essere modificato dalla JVM mentre gli hash delle loro identità vengono mantenuti. Inoltre, due oggetti viventi possono avere lo stesso hash identitario.

Puoi anche usare object.hashCode(), ma può essere specifico per tipo.

Scenario 5: indice univoco

Negli stessi casi è necessario un indice univoco per ciascun oggetto, ad esempio per incrementare automaticamente i valori ID in una tabella del database (e diversamente dall'hash dell'identità che non è univoco). Una semplice implementazione di esempio per questo:

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

Scenario 6: membro enum

In Java i membri enum non sono numeri interi ma oggetti con funzionalità complete (a differenza di C / C ++, ad esempio). Probabilmente non è mai necessario convertire un oggetto enum in int, tuttavia Java associa automaticamente un numero indice a ciascun membro enum. È possibile accedere a questo indice tramite Enum.ordinal(), ad esempio:

enum Foo { BAR, BAZ, QUX }

// ...

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

inserisci qui la descrizione dell'immagine


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

Come puoi vedere, questo non è un modo molto efficiente di farlo. Devi semplicemente essere sicuro del tipo di oggetto che hai. Quindi convertilo in un int nel modo giusto.


Non è @ Deprecated (e invece di a)? :) Bel metodo però, non fa ipotesi sul tipo di oggetto.
extraneon

A proposito, il tuo regex non tiene conto di radix hex o oct. ToInt è un metodo intelligente. Bettere per provare a catturare NumberFormatExcepytion.
extraneon,

4

Devi lanciarlo su un intero (classe wrapper di int). È quindi possibile utilizzare il metodo intValue () di Integer per ottenere l'int interno.


4

Risposta:

int i = ( Integer ) yourObject;

Se il tuo oggetto è già un numero intero, verrà eseguito senza problemi. vale a dire:

Object yourObject = 1;
//  cast here

o

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

eccetera.

Se il tuo oggetto è qualcos'altro, dovrai prima convertirlo (se possibile) in un int:

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

O

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

4

Uso un one-liner durante l'elaborazione dei dati da GSON:

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

È un processo lungo. Basta fare (int) Object invece di Double.valueOf (object.toString ()). IntValue () . Questo funziona solo per i numeri, questo è quello di cui avevamo bisogno.
Sudhakar Krishnan,

1
@SudhakarK: (int) L'oggetto funziona solo se il tuo oggetto è un numero intero. Questo oneliner supporta anche i numeri di stringa; EG "332".
Jacob van Lingen,

2

Se Objectoriginariamente è stato creato un'istanza come Integer, è possibile eseguire il downcast su un intutilizzando l'operatore di cast (Subtype).

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

Si noti che questo funziona solo quando si utilizza almeno Java 1.5 con autoboxing funzione , altrimenti si deve dichiarare icome Integerinvece e quindi chiamare intValue()su di esso .

Ma se inizialmente non è stato creato Integerper niente, non è possibile effettuare il downcast in quel modo. Si tradurrebbe in a ClassCastExceptioncon il nome classe originale nel messaggio. Se la toString()rappresentazione dell'oggetto ottenuta da String#valueOf()indica un numero intero sintatticamente valido (ad esempio solo cifre, se necessario con un segno meno davanti), allora puoi usare Integer#valueOf()o new Integer()per questo.

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

Guarda anche:


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

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

2

Non si può fare Un intnon è un oggetto, è un tipo primitivo. Puoi lanciarlo su Integer, quindi ottenere l'int.

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

 int num = i; //Java 1.5 or higher

Ciò presuppone che l'oggetto sia un numero intero che quasi certamente non lo è. Probabilmente vuole la soluzione di stringa ala Coronauts
Bill K

Come può essere compilato quando si esegue il casting di un oggetto in Object e si cerca di impostarlo su una variabile Integer.
Carlos,

2

Non puoi. An intnon è un Object.

Integerè un Objectpensiero, ma dubito che sia quello che vuoi dire.


C'è auto boxing / unboxing da Java 5.
Bruno

@Bruno: non puoi lanciare un oggetto in un int. È possibile eseguire il cast di un oggetto in un numero intero e quindi assegnarlo a un int e verrà magicamente autounbox. Ma non puoi lanciare un oggetto in un int.
Jay,

(continua) Personalmente, penso che le persone creino molto codice errato basandosi sull'autoboxing. Ad esempio, ho visto una dichiarazione l'altro giorno, "Double amount = (Double.parseDouble (stringAmount)). DoubleValue ();". Cioè, ha analizzato una stringa per ottenere una doppia primitiva, quindi ha eseguito una funzione contro questa, che ha costretto il compilatore a autocaricarlo in un oggetto doppio, ma la funzione era doubleValue che estraeva la doppia primitiva, che quindi ha assegnato a un doppio oggetto forzando così un autobox. Cioè, si è convertito da primitivo a oggetto in primitivo in oggetto, 3 conversioni.
Jay,

@Jay, ho concordato il 1 ° commento (mi dispiace non essere stato chiaro da solo). Per quanto riguarda troppe conversioni, hai ragione anche tu, ma ho l'impressione che il compilatore JIT possa farcela abbastanza bene, quindi non dovrebbe importare molto in pratica (questo non lo rende necessariamente una scusa per un codice errato ...)
Bruno,

1
@Bruno Il trucco di autoboxing che può darti NullPointerExceptions inaspettato.
extraneon

1

Se intendi lanciare una stringa su int, usa Integer.valueOf("123").

Tuttavia, non è possibile eseguire il cast della maggior parte degli altri oggetti in int, poiché non avranno un valore int. Ad esempio un XmlDocument non ha valore int.


1
Non utilizzare Integer.valueOf("123")se tutto ciò di cui hai bisogno è una primitiva, invece usa Integer.parseInt("123")perché il metodo valueOf provoca un unboxing non necessario.
Kerem Baydoğan,

1

Suppongo che ti stai chiedendo perché C o C ++ ti consente di manipolare un puntatore oggetto come un numero, ma non puoi manipolare un riferimento a oggetto in Java allo stesso modo.

I riferimenti agli oggetti in Java non sono come i puntatori in C o C ++ ... I puntatori in pratica sono numeri interi e puoi manipolarli come qualsiasi altro int. I riferimenti sono intenzionalmente un'astrazione più concreta e non possono essere manipolati come possono fare i puntatori.


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

Questo codice mostra perché ArrayListè importante e perché lo usiamo. Casting semplicemente intda Object. Potrebbe essere utile.


Spiega la tua risposta
Gwenc37,

1

Per esempio variabile oggetto; hastaId

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

Ad esempio, lanciare un oggetto in un int,hastaID

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

0

Fare riferimento a questo codice:

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;

Questo mostra una situazione in cui è richiesto il casting e aggiungerò anche l'errore che si presenta in realtà con questa situazione. È difficile per un nuovo programmatore capire l'implementazione effettiva se non c'è esempio. Spero che questo esempio li aiuti
Nehal Pawar,

0

Infine, è stata trovata la migliore implementazione per le tue specifiche.

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

-4

controlla prima con la parola chiave instanceof. se vero, lanciarlo.


Ho usato questo e ora mi chiedo come risolvere il "valore inscatolato è unboxed e immeditaley reboxed" su quella linea. (A causa di controlli spotbugs) quindi ora mi chiedo come risolverlo meglio.
Jasper Lankhorst,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.