Это работает:
public static void main (String[] args) {
Zoo zoo = new Zoo();
zoo.sort(Animal::getRace);
}
Причина проста:
Чтобы отсортировать список Animal
с использованием Comperator
, он должен быть Comperator<Animal>
. Это означает, что функция, которую вы передаете в Comperator.comparing
, должна быть Function<? super Animal,? extends Comperable>
. Это неверно для Function<Dog, String>
, однако это верно для Function<Animal, String>
и Function<Object, String>
.
Вы правильно определяете свой .sort()
, чтобы взять Function<Animal, String>
, но вы передаете функцию-член Dog
- это, по сути, функция Dog -> String
или Function<Dog,String>
в функциональных интерфейсах.
В менее технических терминах: да, Dog
может делать все, что Animal
. Однако это не так - Dog
может иметь функцию, которая есть не у всех животных. Следовательно, недопустимо использовать Function<Dog,?>
вместо Function<Animal,?>
, но все будет нормально.