@ 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:
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.
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:
ObjectIndexer indexer =newObjectIndexer();int x = indexer.indexFor(yourObject);// 1int y = indexer.indexFor(newObject());// 2int 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:
enumFoo{ BAR, BAZ, QUX }// ...Object baz =Foo.BAZ;int index =((Enum)baz).ordinal();// 1
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.
É 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 =newInteger(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));
@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.
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.
int[] getAdminIDList(String tableName,String attributeName,int value)throwsSQLException{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[]=newint[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.
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.
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.
Object
não forInteger
, não tenho certeza do que você espera do seu elenco.intValue
), criar um construtor para a enumeração que define ointValue
, fazer com que as constantes da enumeração invoquem esse construtor e adicionar um getter paraintValue
. Então, em vez de transmitir, chame o getter.Respostas:
Se você tem certeza de que esse objeto é um
Integer
:Ou, a partir do Java 7, você pode escrever de forma equivalente:
Cuidado, ele pode lançar a
ClassCastException
se seu objeto não forInteger
e aNullPointerException
se seu objeto fornull
.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 umObject
, a única maneira é ter umint
/ caixa considerado eInteger
depois armazenado como umObject
.Se o seu objeto for a
String
, você poderá usar oInteger.valueOf()
método para convertê-lo em um int simples:Pode lançar a
NumberFormatException
se seu objeto não for realmente umString
com um número inteiro como conteúdo.Recursos :
Sobre o mesmo tópico:
fonte
NullPointerException
ocorrerá durante o unboxing deInteger
intoint
Supondo que o objeto seja um
Integer
objeto, você pode fazer isso:Se o objeto não for um
Integer
objeto, você deverá detectar o tipo e convertê-lo com base em seu tipo.fonte
intValue
para a caixa automática irá chamá-lo para você.intValue
é muito mais claro, especialmente considerando a confusão iniciante entreint
ser intercambiável comInteger
.Cenário 1: caso simples
Se é garantido que seu objeto é um
Integer
, esta é a maneira mais simples:Cenário 2: qualquer objeto numérico
Em Java
Integer
, etcLong
,BigInteger
todos implementam aNumber
interface que possui um método chamadointValue
. Quaisquer outros tipos personalizados com aspecto numérico também devem ser implementadosNumber
(por exemploAge implements Number
:). Então você pode: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 usarInteger.parseInt(String string)
:Se você receber de entrada como
Object
, você pode usar(String)input
, ou, se ele pode ter um outro tipo textual,input.toString()
:Cenário 4: hash de identidade
Em Java, não há ponteiros. No entanto,
Object
possui uma implementação padrão do tipo ponteiro parahashCode()
, que está diretamente disponível viaSystem.identityHashCode(Object o)
. Então você pode: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:
Uso:
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 viaEnum.ordinal()
, por exemplo:fonte
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.
fonte
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.
fonte
Responda:
Se seu objeto já for um número inteiro, ele será executado sem problemas. ou seja:
ou
etc.
Se seu objeto for qualquer outra coisa, você precisará convertê-lo (se possível) para um int primeiro:
Ou
fonte
Eu uso uma linha para processar dados do GSON:
fonte
Se o
Object
foi originalmente instanciado como umInteger
, você pode fazer o downcast para umint
usando o operador de conversão(Subtype)
.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
i
como alternativaInteger
e depois acessáintValue()
-lo .Mas se inicialmente não foi criado como um
Integer
todo, você não pode fazer o downcast assim. Isso resultaria em umClassCastException
com o nome da classe original na mensagem. Se atoString()
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 usarInteger#valueOf()
ounew Integer()
para isso.Veja também:
fonte
fonte
Não pode ser feito. Um
int
não é um objeto, é um tipo primitivo. Você pode convertê-lo para Inteiro e obter o int.fonte
Você não pode. Um
int
não é umObject
.Integer
é umObject
pensamento, mas duvido que seja isso que você quer dizer.fonte
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.
fonte
Integer.valueOf("123")
se tudo o que você precisa é de um primitivo; em vez disso, useInteger.parseInt("123")
porque o método valueOf causa um unboxing desnecessário.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.
fonte
Este código mostra por que
ArrayList
é importante e por que usamos. Simplesmente lançarint
a partirObject
. Pode ser útil.fonte
Por exemplo, variável de objeto;
hastaId
Por exemplo, converter um objeto em um int,
hastaID
fonte
Consulte este código:
fonte
fonte
Por fim, foi encontrada a melhor implementação para sua especificação.
fonte
verifique primeiro com instanceof keyword. se for verdade, faça o lançamento.
fonte