Receber um object e converter pra int

35 respostas
evertonsilvagomesjav
public static void main(String[] args) {

int[] numeros = {1,2,3};
teste(numeros);

}
public static void teste(Object numero){
	// imprimir aqui os numeros do array.	
		System.out.println("object");
	}
Pessoal como eu faço pra poder imprimir onde eu comentei os numeros do array, pq com o argumento int eu faria dessa forma, mas com object como faço?
public static void testeI(int...numero){
		for(int teste : numero){
			System.out.println(teste);
		}
		System.out.println("varargs int");
	}

35 Respostas

ViniGodoy

Como isso é uma operação arriscada, já que de dentro da função vc não pode garantir que o object é mesmo um int[], você precisa de um cast.

public static void teste(Object numero){ int[] numeros = (int[])numero; for(int teste : numeros){ System.out.println(teste); } System.out.println("object"); }

evertonsilvagomesjav

Vini muito obrigado deixa eu fazer so mais um pergunta, esse cast foi de um Object para um int[] isso é possivel so porque um array e um objeto? Se fosse por exemplo um cast de um Object para um “int” somente iria da ClassCastException?

ViniGodoy

Sim. É possível pq int[] é um objeto.

Não é possível converter para um int primitivo. int e Objects não são convertíveis, portanto, você nem sequer conseguiria compilar o código.

O ClassCastException você recebe sempre que o Object contiver um valor que não seja do tipo ao qual vc está tentando fazer cast. Por exemplo, ao chamar a função assim:

String[] x = {"a", "b"}; teste(x); //ClassCastException String[] não é um int[]

Da mesma forma, vc receberia um ao tentar converter o Object para um Integer. Já que int[] também não é convertível para Integer.

evertonsilvagomesjav

Hum vlw brigadão Vini.

D

Só para completar você ainda pode testar se o Object q vc recebeu é realmente um int[]

public static void teste(Object numero){    

   if (numero instanceof int[]) {

      int[] numeros = (int[])numero;  
      for(int teste : numeros){    
         System.out.println(teste);    
      }    
      System.out.println("object");       
   }
}
evertonsilvagomesjav

e se no caso o metodo tivesse como argumento um varargs de Object (Object…numero) teria como fazer cast?

D

Você trabalha como se fosse um array msm

evertonsilvagomesjav

sim, mas teria que fzer um cast pra poder imprir os numeros, esse cast seria como? To tentando aqui mas ta dando erro.

Marky.Vasconcelos
public void teste(Object...args){
int[] ints = (int[])args[0];
}
evertonsilvagomesjav

Mark vlw cara deu certo aqui, mas olha so args[0], esta sendo atribuido somente a posição 0 do array? Eu entendi que sim ai na hora de imprimir imprimiu todos…

sergiotaborda
evertonsilvagomesjava:
public static void main(String[] args) {

int[] numeros = {1,2,3};
teste(numeros);

}
public static void teste(Object numero){
	// imprimir aqui os numeros do array.	
		System.out.println("object");
	}

Das duas uma. Ou vc quer uma função de impressão generica, ou quer impremir array de int.
Se é array de int, use test(int[] array) e pronto. Se é genérica user numero.toString();

Não faça cast.

thundercas

Apenas uma observação: Você até poderia converter de Object para inteiro, mas teria que usar a classe Integer…

evertonsilvagomesjav

nao tem como converter um array int[] para um Integer não, eu so to fazendo testes em chamada de métodos, ai queria saber so pq o metodo do Mark acima ele passa a posiçao 0 e imprime todas posiçoes…

ViniGodoy

Por que ele encara o array inteiro como um único objeto, que é colocado no índice 0.

evertonsilvagomesjav

Vini isso é regra pra métodos com argumentos (Object…) ?
E passado tudo de um array so para a posiçao 0?

ViniGodoy

Se o array for de Object[], não.

evertonsilvagomesjav

Se eu passar um array de Object, por exemplo como, Object numeros = {1,2,3} para um método (Object…), não tem como eu ler os numeros nao tem? Porque não tem como converter um array Object para Integer e depois para int…

ViniGodoy

Tem sim.

Object objects = new Object[3];
objects[0] = 1;
objects[1] = 2;
objects[2] = 3;

for (Object obj : objects) {
   Integer numero = (Integer)obj;
   System.out.println(numero);
}
evertonsilvagomesjav

No Vini brigadao eheh, o array nao da pra converter mas a posiçao sim rsrs vlw vini brigadao!!

ViniGodoy

Eu já te falei isso, vou repetir.

Cast não é conversão, quando o assunto são objetos. Conversão só ocorre entre tipos primitivos.

Todo Integer é um object. Portanto, quando você faz:

Object x = new Integer(10);

Você só está dizendo que x é uma variável do tipo Object, que contém um Integer de tamanho 10. Não tem conversão. Tanto que se você perguntar:

x instanceof Integer

Mesmo x sendo do tipo object, a resposta ainda é true. Já que o objeto guardado em X é realmente um Integer.

Quando você cria uma função assim:

public funcao(Object ... objetos)

Você está dizendo para o Java: “Essa função recebe uma lista de objetos. Tanto faz seu tipo específico”.

Por isso, é possível chamar a função, com qualquer objeto:

funcao(new Integer(3), new Double(4), new Float(10));

Se quiser que um objeto específico volte a ser encarado em seu tipo específico, vai precisar fazer um cast. No caso de objeto, o cast não faz conversão nenhuma. Por exemplo:

Integer numero = (Integer)objetos[i];

Esse código diz o seguinte: “Ei, Java. Eu tenho certeza que o objeto no índice i desse array de objetos é um Integer. Então, para de chamar ele de Object, e passe a chamar ele de Integer!”

Caso você esteja enganado, o Java vai te dar um ClassCastException. É o mesmo que ele dizer:
“Olha, meu filho… vc falou que era Inteiro, mas o tipo que está em Object[i] não é inteiro não.”

Sem entender que não existe conversão, você realmente vai confundir muita coisa. Lembre-se que objetos agrupam-se com a relação de herança. Portanto, um Integer é um Object e, portanto, pode ser referenciado por referências que guardam objects.

Object x = new Integer(10);

é o mesmo que dizer ao Java:
“Ei, Java, o objeto x é um Inteiro com valor 10”.

evertonsilvagomesjav

Eu entendi Vini o que vc quis dizer, mas como seria a palavra correta pra se usar quando se da um Cast em vez de “conversão” quando se trata de Objetos?

ViniGodoy

Eu acabo usando a palavra cast. Quando fala conversão, está se referindo a conversão da referência, não do objeto que ela aponta. Só acho importante frizar isso pq vc está estudando, e se começar a confundir esse conceito, as coisas complicam. :wink:

evertonsilvagomesjav

Vini aproveitando que vc esta me ajudando, quando falamos de conversão entao por exemplo:

1. double numeroDouble = 10.0 2. int numeroInt = (int) numeroDouble;

bom isso é uma conversão, pelo que eu entendi o que vc me explicou estaria acontecendo o seguinte, numeroDouble aponta para um double, na linha dois o cast “conversão”
muda somente a referencia (conteudo) da variavel numeroDouble para 10 mas a variavel numeroDouble ainda aponta para um double. E isso mesmo Vini, desculpa se não for.

ViniGodoy

Neste caso são tipos primitivos. Em tipos primitivos há conversão.

Decore a lista de tipos primitivos:

byte  short  int  long  float  double  boolean

Note que seus nomes começam por letra minúscula. Entre tipos primitivos, há conversão:

double y = 10.5; int x = (int)y;

X agora vale 10. Note que a parte fracionária foi descartada, portanto, o Java trabalhou para que ela desaparecesse. Da mesma forma, quando você faz a conversão de um int para um double, pode haver perda de precisão, especialmente em números muito grandes. As duas variáveis agora apontam para valores diferentes. Tanto que se você alterar o valor de y, o de x não mudará.

Entre objetos, isso não acontece:

//Criamos um cachorro
Cachorro fido = new Cachorro("fido");
Object objeto = fido;  //Criamos uma referência do tipo object, que aponta para nosso cachorro

System.out.println(objeto); //Imprime "fido", que é o nome do nosso cachorro
Cachorro dog = (Cachorro) objeto; //Criamos uma outra referência, que aponta para o mesmo cachorro de object
dog.setNome("fifi"); //Alteramos o nome desse cachorro

System.out.println(fido.getNome()); //Se imprimirmos o nome, vemos que o nome do fido mudou. Isso imprime "fifi"

Percebeu? Aqui, estamos falando apenas de referências apontando para o mesmo objeto. O objeto em si, não sofreu nenhum tipo de conversão, e é o mesmo para todos os casos. Ele nasceu cachorro, foi referenciado com o um objeto qualquer no meio do caminho (mas ainda era um cachorro), e vai morrer cachorro.

evertonsilvagomesjav

Hum nesse caso, todos estao referenciando um objeto somente. Nesse caso aqui nao ?

Object a = 10;
		
Integer b =  (Integer)a;
		
b = 20;
		
System.out.println(a);

Pq nesse caso esta parecido com primitivos eu imprimindo "a" esta imprimindo 10, então estao referenciando objetos diferentes.

ViniGodoy

Nesse caso o Java faz:

Object a = new Integer(10);  //Auto-boxing
Integer b =  (Integer)a; //b e a apontam pro mesmo objeto

b = new Integer(20);  //Auto-boxing novamente. Agora b aponta para outro lugar
System.out.println(a);  //Imprime o valor de a.

Ou seja, fazer b = 20, é diferente de só alterar um valor no objeto criado inicialmente.

evertonsilvagomesjav

Agoraaa eu vi a diferença Vinii veja se estou certo:

O codigo abaixo como são objetos, mesmo usando o Cast eles apontam para um objeto somente.

Object a = new Integer(10); //Auto-boxing Integer b = (Integer)a; //b e a apontam pro mesmo objeto

O codigo abaixo como são primitivos é alterado somente a referencia com o cast, e eles apontam para tipos diferentes.

double a = 10.0; int b = (int) a;

thundercas

Apenas complementando o que o Vini Falou, se existisse o método setInt na classe Integer e você fizesse b.setInt(20) ao invés de b = 20, System.out.println(a) imprimiria 20 ao invés de 10.

abs

ViniGodoy

Sim. Mas só corrigindo, o que é alterado é o valor. Referência é para onde a variável aponta. No caso de tipos primitivos, são valores que as variáveis guardam, não referências.

evertonsilvagomesjav

Isso, é alterado no tipo primitivo os valoress, as referencias no caso uma variavel aponta para int e uma para double.

Vini muito obrigado pela ajuda.

marcusvoltolim
ViniGodoy:
Sim. É possível pq int[] é um objeto.

Não é possível converter para um int primitivo. int e Objects não são convertíveis, portanto, você nem sequer conseguiria compilar o código.

O ClassCastException você recebe sempre que o Object contiver um valor que não seja do tipo ao qual vc está tentando fazer cast. Por exemplo, ao chamar a função assim:

String[] x = {"a", "b"};
teste(x); //ClassCastException String[] não é um int[]

Da mesma forma, vc receberia um ao tentar converter o Object para um Integer. Já que int[] também não é convertível para Integer.

Como não pode converter um Object para int?

int num = Integer.parseInt(ObjectQualquer.toString().intValue());

//ou Integer.valueOf(...)
ViniGodoy
marcusvoltolim:
Como não pode converter um Object para int?
int num = Integer.parseInt(ObjectQualquer.toString().intValue());

//ou Integer.valueOf(...)

Você ressustou um tópico tão antigo, para falar besteira?

Primeiro de tudo:
a) O método toString() retorna um texto, que é uma representação geralmente imprecisa do objeto (é muitas vezes feita para humanos lerem). Na maior parte das vezes, esse texto não é convertível para int;
b) Você não pode converter um object para int, porque simplesmente, essa operação não faz sentido. Digamos, qual seria a conversão esperada de uma "Casa" para int? Ou de um "TableModel" para int?

O que você demonstrou só irá funcionar:
a) Com uma String contendo um número;
b) Com classes que representam números inteiros (Integer);

marcusvoltolim
ViniGodoy:
marcusvoltolim:
Como não pode converter um Object para int?
int num = Integer.parseInt(ObjectQualquer.toString().intValue());

//ou Integer.valueOf(...)

Você ressustou um tópico tão antigo, para falar besteira?

Primeiro de tudo:
a) O método toString() retorna um texto, que é uma representação geralmente imprecisa do objeto (é muitas vezes feita para humanos lerem). Na maior parte das vezes, esse texto não é convertível para int;
b) Você não pode converter um object para int, porque simplesmente, essa operação não faz sentido. Digamos, qual seria a conversão esperada de uma "Casa" para int? Ou de um "TableModel" para int?

O que você demonstrou só irá funcionar:
a) Com uma String contendo um número;
b) Com classes que representam números inteiros (Integer);

Ressustei?

Pra mim se vc quer converter algo, vc precisa saber previamente se pode, se eu sei que meu Object contém um número e eu preciso convertê-lo, farei, agora pra que iria converter um TableModel para int? ¬¬ e outra fazendo assim:
int[] = Object
Não iria dar erro, se fosse 1 objeto de Strings ou 1 TableModel?
ViniGodoy

Sim, veja lá. O último post desse tópico antes do seu era de 2009.

É que sua resposta soou genérica. Você simplesmente disse:

E deu um código que, seguindo a linha de racicínio, converteria qualquer Object em int. O que não é verdade.

O código, de fato, é até impreciso, pois ele converte apenas a representação textual do objeto em int. Um BigDecimal, por exemplo, perderia precisão na conversão, mesmo que ele contivesse internamente um valor preciso. Geralmente, é uma péssima idéia trabalhar com toString().

Se você sabe com que tipo de objeto está lidando, então, use um cast e faça a conversão mais apropriada para o tipo. Você pode fazer isso testando com indexOf, já que casts por natureza são perigosos. Por exemplo:

int valor; if (seuObject instanceof Integer) { valor = ((Integer)seuObject).intValue(); } else if (seuObject instanceof String) { valor = Integer.parseInt(seuObject.toString()); } ...

Não só é mais rápido, como vc evitar perder precisão. É claro que conversão de qualquer tipo é possível, mas como expliquei há alguns anos atrás, você precisa saber se esse object é convertível, para só então chamar o método de conversão apropriado. Qualquer tentativa genérica de conversão será perigosa, pois nada garante que a conversão sequer será possível.

marcusvoltolim

Então chegamos à um concesso… o/
Conversões genéricas é algo muito vago, eu acho… realmente vc precisa saber oq está convertendo ou pelo menos tentando!

ps: *ressuscitou, instaceOf

Criado 26 de novembro de 2009
Ultima resposta 29 de jun. de 2011
Respostas 35
Participantes 7