Джошуа Блох придумал PECS, в которой указано правило, когда использовать ? extends T
и ? super T
. Если вы думаете о PECS с точки зрения структуры коллекций, то все очень просто. Если вы добавляете значения в структуру данных, используйте ? super T
. Если вы читаете из структуры данных, используйте ? extends T
. например:
public class Collections {
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
for (int i = 0; i < src.size(); i++)
dest.set(i, src.get(i));
}
}
Если я проверю подпись
public static <T> void sort(List<T> list, Comparator<? super T> c)
Я вижу, что Comparator использует ? super
, поэтому он должен быть потребителем. Глядя на код, компаратор c используется только для создания материала, потому что ему задают логику сравнения.
С одной стороны, я понимаю, почему это супер, потому что как разработчик я хочу использовать компараторы класса T
, а также компараторы суперкласса T
, потому что объекты T
также относятся к типу суперклассов T
. Но когда я пытаюсь думать с точки зрения PECS, я ничего не понимаю.
Подходит ли PECS только для структуры коллекций? Если нет, может кто-нибудь объяснить мне, что потребляет компаратор в Collections.sort
?