Вы можете говорить о двух вещах:
public static void sort(List list, Comparator c){ ... }
Здесь параметр list
имеет тип интерфейса List
, но любой, кто вызывает метод, должен будет передать экземпляр конкретного класса, например ArrayList
, который реализует интерфейс, и код метода будет называть методы этого конкретного класса - этот механизм называется «диспетчеризация динамического метода» и лежит в основе основного принципа полиморфизма ОО.
sort(myList, new Comparator(){
public int compare(Object o1, Object o2){
...
}
});
Это пример анонимного класса : код фактически определяет новый класс без имени, который реализует интерфейс Comparator
, и в то же время создает экземпляр этого класса. Это используется в Java главным образом для вещей, где другие языки будут использовать языковые конструкции, такие как указатели на функции, замыкания или обратные вызовы: для передачи фрагмента кода, который будет выполнен внутри вызываемого вами метода.