Wrapper por que a saida desse codigo é false?

9 respostas
Raff

Pessoal eu estou com um probleminha de entender Wrapper eu gostaria de saber por que o codigo a baixo imprimi false…

public  void test(){
		
		Integer i = new Integer(10);
		Long l = new Long(10) ;
		boolean b = i.equals(l);
		System.out.println(""+b);
		
	}

9 Respostas

nbluis

O o código do equals da classe Integer.

/**
     * Compares this object to the specified object.  The result is
     * <code>true</code> if and only if the argument is not
     * <code>null</code> and is an <code>Integer</code> object that
     * contains the same <code>int</code> value as this object.
     *
     * @param   obj   the object to compare with.
     * @return  <code>true</code> if the objects are the same;
     *          <code>false</code> otherwise.
     */
    public boolean equals(Object obj) {
	if (obj instanceof Integer) {
	    return value == ((Integer)obj).intValue();
	}
	return false;
    }
adriano_si

Acredito que os Wrappers não lidam com números da mesma forma… acho que quando vc transforma um número em um tipo Empacotador, cada um trata o Nº de uma forma diferente, logo um Integer nunca será igual à um Long… Mas não sei se é realmente isso… sua dúvida virou a minha tbm !!!

Abraços 8)

LPJava

simples tipos diferentes… vc ta testando o valor de dois objetos porem de tipos diferentes ele sempre vai retornar false… experimente testar de mesmo tipo… para ver… a regra é clara… vc so pode testar objetos de mesmo tipos para q seja true…

flw!!!

maquiavelbona

Aproveitando a resposta do colega nbluis e tentando responder ao adriano_si, o método equals() verifica se é verdadeiro nessa ordem:

  1. Os objetos são da mesma classe? Um número inteiro não é um número longo. Analogia estúpida? Um lápis não é igual a uma caneta, mesmo os dois escrevendo da mesma forma. Mas um lápis HB é da mesma forma de um lápis 6B (o que o tornaria verdadeiro) , o que muda é o conteúdo ( o que o torna falso pelo próximo passo);
  2. O conteúdo é o mesmo? É meio óbvio, mas 4 não é 6, portanto os conteúdos devem ser continentemente iguais.

Se ambas as cláusulas forem verdadeiras, retorna verdadeiro.
Poderia fazer analogia com frutas, calçados etc, mas preferi objetos comuns.

Dúvidas é só continuar o tópico.

Até!

Guilherme_Gomes

E se fosse assim:

public  void test(){
 		
 		Integer i = new Integer(10);
 		Integer i2 = new Integer(10) ;
 		boolean b = i.equals((Object)i2);
 		System.out.println(""+b);
 }

ou

public  void test(){
 		
 		Integer i = new Integer(10);
 		Object o = i;
 		boolean b = i.equals(o);
 		System.out.println(""+b);
 }

???

maquiavelbona

Teste e veja os resultados. Um pouco de empirismo não faz mal a ninguém.

Até!

Guilherme_Gomes

As duas dão true! Axo que se alguma desse false eu postaria alguma duvida, hehehehe!

adriano_si

Valew, minha dúvida esclarecida… :wink:

maquiavelbona

Tinham que dar true pois:
1o caso: i e i2 são variáveis de referência a objetos diferentes, mas da mesma instância e com mesmo conteúdo, portanto atendem a demanda do equals.
2o caso: i e o são variáveis de referência diferentes que apontam para o mesmo objeto, portanto eles seriam iguais até numa comparação direta ( == ).

Só para complementar.

Até!

Criado 19 de julho de 2007
Ultima resposta 20 de jul. de 2007
Respostas 9
Participantes 6