Olá pessoal do GUJ.
Esses dias durante o meu trabalho, deparei-me com um trecho de código que estava causando bugs no projeto que estou desenvolvendo.
Até aí nada de novo, o problema é que nunca me deparei com um erro como esse… Como acho que estou ficando louco (pois já trabalho com Java há muito tempo) e como não encontrei nenhuma explicação lógica para o erro (a não ser “Ou eu estou errado… ou o Java está errado”), peço a ajuda e/ou opinião de vocês sobre o caso.
Abaixo segue um pequeno teste unitário que desenvolvi que aborda o problema:
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import junit.framework.TestCase;
public class PolimorphismTest extends TestCase {
public void testCollectionPointerBug() throws Exception {
Collection<Object> collectionPointer = new LinkedList<Object>();
List<Object> listPointer = (List<Object>) collectionPointer;
listPointer.add(new Object());
assertEquals(1, listPointer.size());
listPointer.remove(0);
assertEquals(0, listPointer.size());
collectionPointer.add(new Object());
assertEquals(1, collectionPointer.size());
collectionPointer.remove(0);
assertEquals(0, collectionPointer.size()); // <- Teste falha!!!
}
}
Agora a pergunta… Por causa do polimorfismo, não deveria ser o mesmo resultado? A única diferença entre as duas operações são as referências… O objeto em teoria não deveria executar a mesma operação? Alguém tem o telefone de um psiquiatra?
Agradeço desde já!
Att.,