Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Método

Como no curso, tentei sobrescrever a classe equals como ensinado, mas não obtive sucesso.

Dentro da classe Conta tenho esse código:

    @Override
    public boolean equals(Object obj) {
        System.out.println("estou no seu equals");
        Conta outra = (Conta) obj;

        if (this.agencia != outra.agencia) {
            return false;
        } else if (this.numero != outra.numero) {
            return false;
        } else {
            return true;
        }
    }

E na minha classe de testes tenho esse código:

        Conta cc1 = new ContaCorrente(22, 12);
        Conta cc2 = new ContaCorrente(33,23);
        Conta cc3 = new ContaCorrente(44,45);
        Conta cc4 = new ContaCorrente(33,23);
        Cliente cli = new Cliente();

        ArrayList<Conta> listaDeContas = new ArrayList<Conta>();

        listaDeContas.add(cc1);
        listaDeContas.add(cc2);

        System.out.println(listaDeContas.contains(cli));

Todas as classes foram importadas corretamente, e o eclipse não acusa erro algum. Ao rodar o código era esperado, em qualquer situação, a resposta do método equals:

System.out.println("estou no seu equals");

Mas isso não acontece, aparentando que o método contains ainda está utilizando a definição mais genérica.

Como posso resolver isso?

6 respostas

Bom dia Murilo,

Eu não entendi muito bem em qual classe você sobrescreveu o Equals, se foi na 'Cliente', ContaCorrente ou na 'Conta' .

Não entendi também a lógica de verificar se tem Cliente em uma lista de Contas, você passou cli no parametro do método, é isto mesmo?

System.out.println(listaDeContas.contains(cli));

ou seria o caso de verificar se uma conta está na lista? Poderia explicar o que pretende comparar? Se possível colocar o resto dos códigos. Obrigado.

Foi na classe Conta, pois ela é a classe mãe de todo tipo de conta. Eu testei se há um cliente numa lista de contas justamente para forçar uma resposta false Pois eu tenho certeza de que não há um cliente em uma lista de contas.

Oi Murilo,

eu não to entende o pq vc ta usando o método contains() esperando o resultado do método equals(), são métodos diferentes

solução

Boa tarde Murilo,

Ah acho que agora entendi, mas aqui está retornando false, porém ele não está usando o equals da classe conta. Usando o Debug do eclipse eu percebi que como você passou um objeto Cliente ele usou o equals do Cliente, como ele não tem override, ele usou o padrão do Objeto.

o ArraList.class tem este método para verificar:

 public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

no caso o "o" é o "cli" ...e ele chama o equals do Cliente nesta linha:

     if (o.equals(elementData[i]))

ou seja, implemente equals no Cliente com alguma mensagem diferente para saber qual equals ele chama. Por exemplo:

System.out.println("estou no  equals do Cliente");

espero ter ajudado.

Leonardo, creio que você não viu a aula, o método contains usa o equals internamente.

Murilo, eu tinha deixado essa parte passar. Entrei na documentação do método e vi isso depois que vc falou.