Множественные расширения в универсальных функциях java

#java #generic-programming #generic-list

#java #универсальное программирование #общий список

Вопрос:

Я хочу реализовать простую функцию сортировки, которая сортирует список и возвращает отсортированный список (очень просто!). Итак, я написал это

 public static <T extends List<? extends Comparable>> T sort(T objects)
{
    Collections.sort(objects);
    return objects;
}
 

Проблема в том, что когда я пытаюсь отсортировать простой список, он выдает мне эту ошибку

Ошибка: (19, 20) ошибка: не найден подходящий метод для коллекций методов сортировки (T # 1). сортировка (Список) неприменима (не удается определить переменные типа T # 2 (несоответствие аргументов; T # 1 не может быть преобразован в список)) метод Collections.sort(список, компаратор) неприменим (не может определить переменные типа T # 3 (фактические и формальные списки аргументов отличаются по длине)), где T # 1, T # 2, T # 3 являются переменными типа: T # 1 расширяет список, объявленный в методесортировка (T # 1) T # 2 расширяет сопоставимость, объявленную в методе sort(List) T # 3 расширяет объект, объявленный в методе sort(List,Comparator), где CAP # 1 является новой переменной типа: CAP # 1 расширяет сопоставимость из захвата? расширяет сопоставимые

Так в чем проблема ?!

Заранее спасибо :)))

Комментарии:

1. Одна из проблем заключается в том, что if T extends P , List<T> не расширяется List<P> , поэтому каким-то образом ваш generic неверен, поскольку вы ожидаете T extends List<..> .

2. И какова цель этого метода в первую очередь? Почему бы не вызвать Collections.sort() на месте ?!

Ответ №1:

Как указал @Bejan George, общим типом в этом случае должен быть не список, а сопоставимые элементы, содержащиеся в списке.

Правильная реализация будет:

 public static <T extends Comparable> List<T> sort(List<T> objects) {
    Collections.sort(objects);
    return objects; 
}