Я понимаю получить и поместить принцип для коллекций: если метод берет в коллекции, что он будет писать тип T to, параметр должен быть Collection<? super T>, тогда как если он будет читать тип T, параметр должен быть Collection<? extends T>.
Но кто-то может объяснить Collections.max() подпись:
public static <T> T max(Collection<? extends T> coll,
                    Comparator<? super T> comp)
В частности, почему он Comparator<? super T> вместо Comparator<? extends T>?