Boa noite pessoal,
No livro SCJP 6, no capítulo de genéricos e coleções, página 327, é dada as seguintes classes:
public class Dog {
public String name;
public Dog(String n) {
this.name = n;
}
@Override
public boolean equals(Object obj) {
if ((obj instanceof Dog) && ((Dog) obj).name == name) {
return true;
} else {
return false;
}
}
@Override
public int hashCode() {
return name.length();
}
}
public class Cat {}
import java.util.HashMap;
import java.util.Map;
public class MapTest {
/**
* @param args
*/
public static void main(String[] args) {
Map<Object, Object> m = new HashMap<Object, Object>();
Dog d1 = new Dog("clover");
m.put(d1, "Dog key");
m.put(new Cat(), "Cat key");
System.out.println(m.get(d1));
System.out.println(m.get(new Cat()));
}
}
O livro diz que a saída será:
Dog key
null
O que está correto, o que eu não estou entendo é a explicação que o livro dá:
“O ponto importante aqui é que o método get() não conseguiu encontrar o objeto Cat que foi inserido anteriormente…
…Por que foi possível usar uma instancia de Dog como chave, enquanto que usar uma instancia de Cat como chave não teve sucesso?
É fácil ver que Dog substituiu equals() e hashCode(), enquanto que Cat não o fez.”
Pra mim pelo que eu entendi o retorno é null porque são utilizadas duas referencias distintas de Cat, tanto que se alterar o trecho de código de modo a utilizar a mesma referencia de Cat tanto na inserção quanto na busca, o retorno será “Cat key”…
Nesse caso eu não estou entendendo bem ou no livro essa explicação não procede?
Valeu!