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.