Существует ряд вопросов о переполнении стека о сортировке Generics; однако меня интересует сортировка Generics самым простым способом: ничего не вложенное. Код, приведенный ниже, - это попытка сортировать общий набор - или, список - элементов.
List<E> l = new LinkedList<>(arbSet);
Collections.sort(l);
arbSet
- это всего лишь набор элементов: Set<E> arbSet
.
Ясно, что это проблематично - оно не должно работать. Чтобы убедиться, что я это знаю, Eclipse дает мне следующее для моей попытки вызвать .sort
:
Связанное несоответствие: общий тип метода (Список <T>) типа Collections не применим для аргументов (List <E>). Выведенный тип E не является допустимой заменой ограниченного параметра <T extends Comparable <? супер T >>
Итак, я немного разбираюсь в документации, глядя на спецификации sort
.
В результате я пытаюсь обеспечить, чтобы sort
знала, что E
extends Comparable
:
Первая строка теперь выглядит так:
List<E extends Comparable<? super E>> l = new LinkedSet<>(arbSet);
Теперь Eclipse заявляет:
Синтаксическая ошибка на токене "extends", ожидается
Что мне не хватает? Я чувствую, что это очень простой пример и что я просто пропускаю что-то "ладонь". Просто чтобы упростить его еще дальше, все arbSet
элементы являются элементами, которые реализуют Comparable
интерфейс.
Вы можете использовать Collections.sort()
только в том случае, если вы предоставляете собственный Comparator
или если элементы, которые вы пытаетесь сортировать, реализуете интерфейс Comparable
. Это зависит от того, какие элементы хранятся в arbSet
.
Например, если вы хотите создать метод, который принимает набор, и возвращает список с отсортированными элементами, вы сделаете что-то вроде этого:
static <E extends Comparable<E>> List<E> sortedListFrom(Set<E> set) {
List<E> l = new LinkedList<>(set);
Collections.sort(l);
return l;
}
Редактировать:
Если вы хотите сделать это внутри конструктора, у вас есть два варианта:
Объявите тип E
непосредственно перед конструктором. Конечно, это не будет сделано, потому что list
теряется после завершения конструктора.
class Test {
<E extends Comparable<E>> Test(Set<E> arbSet) {
List<E> list = new LinkedList<>(arbSet);
Collections.sort(list);
System.out.println(list);
}
}
Объявите тип E
в классе, чтобы вы могли сохранить результат в атрибуте.
class Test<E extends Comparable<E>> {
List<E> list;
Test(Set<E> arbSet) {
this.list = new ArrayList<>(arbSet);
Collections.sort(this.list);
System.out.println(this.list);
}
}
E
?