Como converter um objeto em um int


221

Como converter um objeto para um int em java?


6
O que você realmente quer fazer? Se Objectnão for Integer, não tenho certeza do que você espera do seu elenco.
Unholysampler

2
verifique primeiro com instanceof keyword. se for verdade, faça o lançamento.
Dead Programmer

Aww. Eu só queria ter membros de enum para converter em valores inteiros específicos, para que eu possa ter enumerações para constantes winapi. msdn.microsoft.com/pt-br/library/windows/desktop/…
Tomáš Zato - Reinstala Monica em

@ TomášZato Você pode fazer isso (mais ou menos), basta definir um campo na sua enumeração para conter o valor inteiro (por exemplo, intValue), criar um construtor para a enumeração que define o intValue, fazer com que as constantes da enumeração invoquem esse construtor e adicionar um getter para intValue. Então, em vez de transmitir, chame o getter.
Brian McCutchon

Respostas:


385

Se você tem certeza de que esse objeto é um Integer:

int i = (Integer) object;

Ou, a partir do Java 7, você pode escrever de forma equivalente:

int i = (int) object;

Cuidado, ele pode lançar a ClassCastExceptionse seu objeto não for Integere a NullPointerExceptionse seu objeto for null.

Dessa forma, você assume que seu objeto é um número inteiro (o int encapsulado) e o unbox em um int.

inté um primitivo, portanto, não pode ser armazenado como um Object, a única maneira é ter um int/ caixa considerado e Integerdepois armazenado como um Object.


Se o seu objeto for a String, você poderá usar o Integer.valueOf()método para convertê-lo em um int simples:

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

Pode lançar a NumberFormatExceptionse seu objeto não for realmente um Stringcom um número inteiro como conteúdo.


Recursos :

Sobre o mesmo tópico:


Você tem certeza da NullPointerException? Eu pensei que um objeto nulo seria apenas produzir um nulo Integer ....
Etienne de Martel

7
O NullPointerExceptionocorrerá durante o unboxing de Integerintoint
Colin Hebert

Você não está convertendo para um int, nenhum objeto pode ser convertido para um int. Você está na verdade com Integer e, em seguida, autoboxing para um int.
Steve Kuo

1
@ Steve Kuo, Sim, exatamente o que estou dizendo. Por isso não usei a palavra "elenco".
Colin Hebert

@ Etienne: Você pode converter um objeto nulo em um número inteiro, obtendo um número inteiro nulo. Mas quando você tenta extrair o int dele, você recebe uma exceção de ponteiro nulo. Não existe um "nulo int".
Jay

18

Supondo que o objeto seja um Integerobjeto, você pode fazer isso:

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

Se o objeto não for um Integerobjeto, você deverá detectar o tipo e convertê-lo com base em seu tipo.


Se obj for nulo, lançará uma NullPointerException.
Colin Hebert

e um ClassCastException se não for um objeto Inteiro.
Erick Robertson

1
Não há necessidade de chamar intValuepara a caixa automática irá chamá-lo para você.
OscarRyz 7/09/10

1
intValueé muito mais claro, especialmente considerando a confusão iniciante entre intser intercambiável com Integer.
Steve Kuo

14

Cenário 1: caso simples

Se é garantido que seu objeto é um Integer, esta é a maneira mais simples:

int x = (Integer)yourObject;

Cenário 2: qualquer objeto numérico

Em Java Integer, etc Long, BigIntegertodos implementam a Numberinterface que possui um método chamado intValue. Quaisquer outros tipos personalizados com aspecto numérico também devem ser implementados Number(por exemplo Age implements Number:). Então você pode:

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

Cenário 3: analisar texto numérico

Ao aceitar a entrada do usuário na linha de comando (ou no campo de texto etc.), você a obtém como a String. Nesse caso, você pode usar Integer.parseInt(String string):

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

Se você receber de entrada como Object, você pode usar (String)input, ou, se ele pode ter um outro tipo textual, input.toString():

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

Cenário 4: hash de identidade

Em Java, não há ponteiros. No entanto, Objectpossui uma implementação padrão do tipo ponteiro para hashCode(), que está diretamente disponível via System.identityHashCode(Object o). Então você pode:

int x = System.identityHashCode(yourObject);

Observe que esse não é um valor real do ponteiro. O endereço de memória dos objetos pode ser alterado pela JVM enquanto seus hashes de identidade estão sendo mantidos. Além disso, dois objetos vivos podem ter o mesmo hash de identidade.

Você também pode usar object.hashCode(), mas pode ser específico do tipo.

Cenário 5: índice exclusivo

Nos mesmos casos, você precisa de um índice exclusivo para cada objeto, como auto-incrementar valores de ID em uma tabela de banco de dados (e diferente do hash de identidade que não é exclusivo). Uma implementação de amostra simples para isso:

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

Cenário 6: membro da enumeração

No Java enum, os membros não são números inteiros, mas objetos com recursos completos (ao contrário do C / C ++, por exemplo). Provavelmente, nunca é necessário converter um objeto enum int, no entanto, o Java associa automaticamente um número de índice a cada membro da enum. Este índice pode ser acessado via Enum.ordinal(), por exemplo:

enum Foo { BAR, BAZ, QUX }

// ...

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

insira a descrição da imagem aqui


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 você pode ver, essa não é uma maneira muito eficiente de fazer isso. Você simplesmente precisa ter certeza de que tipo de objeto você tem. Em seguida, converta-o para um int da maneira correta.


Não é @ Deprecated (e em vez de a)? :) No entanto, o método agradável não faz suposições sobre o tipo do objeto.
extraneon

A propósito, seu regex não leva em consideração o radix hex ou oct. ToInt é um método inteligente. Melhor tentar pegar NumberFormatExcepytion.
extraneon

4

Você deve convertê-lo em um número inteiro (classe de wrapper do int). Você pode usar o método intValue () de número inteiro para obter o int interno.


4

Responda:

int i = ( Integer ) yourObject;

Se seu objeto já for um número inteiro, ele será executado sem problemas. ou seja:

Object yourObject = 1;
//  cast here

ou

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

etc.

Se seu objeto for qualquer outra coisa, você precisará convertê-lo (se possível) para um int primeiro:

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

Ou

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

4

Eu uso uma linha para processar dados do GSON:

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

É um processo demorado. Apenas faça (int) Object em vez de Double.valueOf (object.toString ()). IntValue () . Isso funciona apenas para números, é disso que precisamos.
Sudhakar Krishnan

1
@SudhakarK: (int) O objeto só funciona se o seu objeto for um número inteiro. Este oneliner também suporta números de String; EG "332".
Jacob van Lingen

2

Se o Objectfoi originalmente instanciado como um Integer, você pode fazer o downcast para um intusando o operador de conversão (Subtype).

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

Observe que isso só funciona quando você está usando pelo menos o Java 1.5 com o recurso de caixa automática , caso contrário, você deve declarar icomo alternativaInteger e depois acessáintValue() -lo .

Mas se inicialmente não foi criado como um Integertodo, você não pode fazer o downcast assim. Isso resultaria em um ClassCastExceptioncom o nome da classe original na mensagem. Se a toString()representação do objeto, obtida por, String#valueOf()denota um número inteiro sintaticamente válido (por exemplo, apenas dígitos, se necessário com um sinal de menos na frente), você pode usar Integer#valueOf()ou new Integer()para isso.

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

Veja também:


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

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

2

Não pode ser feito. Um intnão é um objeto, é um tipo primitivo. Você pode convertê-lo para Inteiro e obter o int.

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

 int num = i; //Java 1.5 or higher

Isso pressupõe que o objeto é um número inteiro que quase certamente não é. Provavelmente quer é a solução de string ala Coronauts
Bill K

Como ele poderia ser compilado quando você está convertendo um objeto em Object e, em seguida, tentando defini-lo como uma variável Inteiro.
Carlos

2

Você não pode. Um intnão é um Object.

Integeré um Objectpensamento, mas duvido que seja isso que você quer dizer.


Há auto boxe / unboxing desde Java 5.
de Bruno

@Bruno: Você não pode converter um objeto em um int. Você pode converter um Objeto em um Número Inteiro e depois atribuí-lo a um int, que será automaticamente enviado automaticamente. Mas você não pode converter um objeto em um int.
Jay

(continuação) Pessoalmente, acho que as pessoas criam muitos códigos ruins, dependendo da caixa automática. Como, vi uma declaração no outro dia, "Double amount = (Double.parseDouble (stringAmount)). DoubleValue ();". Ou seja, ele analisou uma String para obter uma primitiva dupla e, em seguida, executou uma função contra isso, o que forçou o compilador a aplicá-la automaticamente em um objeto Double, mas a função foi doubleValue, que extraiu a primitiva dupla, que ele atribuiu a uma Double objeto forçando assim uma caixa automática. Ou seja, ele converteu de primitivo para objeto em primitivo para objeto, 3 conversões.
Jay

@ Jay, concordou no primeiro comentário (desculpe, eu não estava claro). Em relação a muitas conversões, você também está certo, mas tenho a impressão de que o compilador JIT pode lidar muito bem com isso, portanto, isso não deve importar muito na prática (isso não significa necessariamente uma desculpa para códigos incorretos). ...)
de Bruno

1
@Bruno A parte complicada da autoboxing é a possibilidade de gerar NullPointerExceptions inesperadas.
extraneon

1

Se você quer dizer converter uma String para int, use Integer.valueOf("123") .

Você não pode converter a maioria dos outros objetos para int, porque eles não terão um valor int. Por exemplo, um XmlDocument não tem valor int.


1
Não use Integer.valueOf("123")se tudo o que você precisa é de um primitivo; em vez disso, use Integer.parseInt("123")porque o método valueOf causa um unboxing desnecessário.
Kerem Baydoğan

1

Eu acho que você está se perguntando por que C ou C ++ permite manipular um ponteiro de objeto como um número, mas você não pode manipular uma referência de objeto em Java da mesma maneira.

Referências a objetos em Java não são como ponteiros em C ou C ++ ... Os ponteiros são basicamente números inteiros e você pode manipulá-los como qualquer outro int. As referências são intencionalmente uma abstração mais concreta e não podem ser manipuladas da mesma maneira que os ponteiros.


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 mostra por que ArrayListé importante e por que usamos. Simplesmente lançar inta partir Object. Pode ser útil.


Por favor, explique sua resposta
Gwenc37

1

Por exemplo, variável de objeto; hastaId

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

Por exemplo, converter um objeto em um int,hastaID

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

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

0
so divide1=me.getValue()/2;

int divide1 = (Integer) me.getValue()/2;

Isso mostra uma situação em que a transmissão é necessária e também adicionarei o erro que realmente aparece com essa situação. É difícil para um novo codificador descobrir a implementação real, se não houver exemplo. Espero que este exemplo ajuda-los
Nehalem Pawar

0

Por fim, foi encontrada a melhor implementação para sua especificação.

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

-4

verifique primeiro com instanceof keyword. se for verdade, faça o lançamento.


Eu usei isso e agora estou me perguntando como resolver o 'Valor em caixa está fora da caixa e, em seguida, imediatamente reboxado' nessa linha. (Devido a verificações de spotbugs) então agora eu estou querendo saber como resolvê-lo melhor.
Jasper Lankhorst
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.