Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Ao criar classe anônima, que tipo estamos criando?

Oi!

Tenho na classe Teste :

public class Teste {

    public static void main(String[] args) {

        Conta cc1 = new ContaCorrente(22, 33);
        Cliente clienteCC1 = new Cliente();
        clienteCC1.setNome("Nico");
        cc1.setTitular(clienteCC1);
        cc1.deposita(333.0);

        Conta cc2 = new ContaPoupanca(22, 44);
        Cliente clienteCC2 = new Cliente();
        clienteCC2.setNome("Guilherme");
        cc2.setTitular(clienteCC2);
        cc2.deposita(444.0);

        Conta cc3 = new ContaCorrente(22, 11);
        Cliente clienteCC3 = new Cliente();
        clienteCC3.setNome("Paulo");
        cc3.setTitular(clienteCC3);
        cc3.deposita(111.0);

        Conta cc4 = new ContaPoupanca(22, 22);
        Cliente clienteCC4 = new Cliente();
        clienteCC4.setNome("Ana");
        cc4.setTitular(clienteCC4);
        cc4.deposita(222.0);

        List<Conta> lista = new ArrayList<>();
        lista.add(cc1);
        lista.add(cc2);
        lista.add(cc3);
        lista.add(cc4);

E, o código abaixo é a continuação do de cima, mas é aí que é a dúvida:

       lista.sort(new Comparator<Conta>() {
            @Override
            public int compare(Conta c1, Conta c2) {
                return Integer.compare(c1.getNumero(), c2.getNumero());
            }
        });

    }// fecha main
}// fecha classe Teste

Minha dúvida é: Como o Java entende que a classe anônima implementa a interface Comparator<> , ao invés de ser um tipo dela?

Como ele entende diferente do seguinte pedaço de código:

       Comparator<Conta> comp = new Comparator<Conta>() {

            @Override
            public int compare(Conta c1, Conta c2) {
                String nomeC1 = c1.getTitular().getNome();
                String nomeC2 = c2.getTitular().getNome();
                return nomeC1.compareTo(nomeC2);
            }
        };

Confesso que fiquei um pouco confuso a respeito disso, e agora não tenho certeza se esses dois são classes do tipo Comparator, ou se apenas a implementam.

help me.

Obrigado.

2 respostas
solução!

Boa noite, Gustavo! Como vai?

Ambos os exemplos são semelhantes pois vc cria um objeto de uma classe anônima que já implementa a interface Comparator<T>! A diferença é que no segundo caso vc cria o objeto e também cria uma referência para ficar de olho nele!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Valeu Gabriel!

Depois que postei a dúvida, conversei com meu irmão, que entende bastante, e ele me explicou que ao fazer

new Comparator<Conta>() { };

Estamos criando uma classe "do tipo Comparator" , mas como Comparator não é uma classe, e sim uma interface ( que tem um método sem default ) , o Eclipse manda você implementar aquele método.

Aí voltei a entender.

Java <3