Понимание основ сортировки дженериков

1

Существует ряд вопросов о переполнении стека о сортировке 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 интерфейс.

  • 0
    Где объявлен параметр типа E ?
Теги:
generics
sorting

1 ответ

2
Лучший ответ

Вы можете использовать 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;
}

Редактировать:

Если вы хотите сделать это внутри конструктора, у вас есть два варианта:

  1. Объявите тип 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);
        }
    }
    
  2. Объявите тип 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);
        }
    }
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню