Receber um object e converter pra int

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”.

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?

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:

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.

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.

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

[code]Object a = 10;

Integer b = (Integer)a;

b = 20;

System.out.println(a);[/code]

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

Nesse caso o Java faz:

[code]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.[/code]

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

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;

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

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.

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.

[quote=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.[/quote]

Como não pode converter um Object para int?

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

//ou Integer.valueOf(…)[/code]

[quote=marcusvoltolim]Como não pode converter um Object para int?

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

//ou Integer.valueOf(…)[/code][/quote]

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

[quote=ViniGodoy][quote=marcusvoltolim]Como não pode converter um Object para int?

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

//ou Integer.valueOf(…)[/code][/quote]

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);[/quote]

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?

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.

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