Collections.sort универсальный метод подписи

Внутри java.util.Collections у нас есть подпись метода ниже

public static <T> void sort(List<T> list, Comparator<? super T> c) 

Я не понимаю, почему можно было бы указать

Comparator<? super T>

вместо

Comparator<T>

Какие варианты использования он охватывает?

2 ответа

Решение

Вот пример:

class Person {}

class Student extends Person {}

? super T средства ? это суперкласс (или интерфейс) T, То есть, если компаратор Comparator<Person>, поскольку Student наследуется от Personэтот компаратор все еще должен работать на Student,

List<Student> students = ...
Collections.sort(students, new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        // compare person
        return 0;
    }
});

Если мы изменим Comparator<? super T> в Comparator<T>вышеуказанный код не будет компилироваться.

// A
public static <T extends Comparable<? super T>> void sortA(List<T> list) 

// B
public static <T extends Comparable<T>> void sortB(List<? extends T> list)

Эти подписи отличаются, потому что они накладывают различные требования на отношения между типом T и аргументом типа Comparable в определении T.

Предположим, например, что у вас есть этот класс:

class A implements Comparable<Object> { ... }

Тогда, если у вас есть

List<A> list = ... ;
sortA(list); // works
sortB(list); // fails

Причина, по которой sortA не работает, заключается в том, что не существует типа T, который был бы сопоставим с самим собой, а также является или является супертипом типа списка.

Другие вопросы по тегам