Porque foi possível dar um new na interface Comparator dando a impressão que é possível instanciar uma interface?
Porque foi possível dar um new na interface Comparator dando a impressão que é possível instanciar uma interface?
Você nunca pode instanciar uma interface, mas pode criar uma classe interna anônima que as pessoas às vezes confundem com instanciar uma interface.
Aqui está um exemplo:
Runnable é uma interface, então não posso simplesmente dizer
Runnable run = new Runnable();
como o método run da interface não foi implementado, você não pode criar um objeto diretamente dessa interface.
No entanto, posso criar um objeto que implemente Runnable on the fly, fornecendo a implementação do método run in-line:
Runnable run = new Runnable() {public void run(){…}};
PS: No Java 8 ou posterior, você pode tornar o código ainda mais simples usando lambdas….
Runnable run = () -> {…};
Java pode dizer que a expressão lambada é destinada à implementação do método run, porque Runnable é uma interface funcional (por exemplo, define apenas um método abstrato).
Super recomendo que você faça esse curso para entender melhor essa questão de classes anônimas em Java 8: https://www.alura.com.br/curso-online-java8-lambdas