Почему этот метод сортировки кучи работает с <T>, но не с подстановочным знаком ? - PullRequest
1 голос
/ 09 марта 2020

Я реализовал его с очередью Приоритет из-за задачи. У меня вопрос, почему он работает так:

public <T> void heapSort(List<T> elements){
    PriorityQueue<T> q = new PriorityQueue<>(elements);

    elements.clear();
    while (!q.isEmpty()){
        elements.add(q.poll());
    }
}

Но он перестает работать, когда я заменяю его подстановочным знаком?

public void heapSort(List<?> elements){
    PriorityQueue<?> q = new PriorityQueue<>(elements);

    elements.clear();
    while (!q.isEmpty()){
        elements.add(q.poll());
    }
}

1 Ответ

3 голосов
/ 09 марта 2020

Пожалуйста, кто-нибудь, объясните мне, почему?

В общем, вы не можете добавлять элементы из PriorityQueue<?> в List<?>, потому что очередь может быть PriorityQueue<String> и список может быть List<Integer>.

Компилятор не «запоминает», что параметр типа одинаков в обоих случаях, если только вы не создадите переменную типа, чтобы сказать, что они являются то же самое.

и как это исправить.

Вы знаете, как это исправить: используйте переменную типа, как в первом примере кода.

Если вы имеете в виду, как не иметь переменную типа в сигнатуре метода, вы можете делегировать закрытому методу:

public void heapSort(List<?> elements) {
  heapSortPrivate(elements);
}

private <T> void heapSortPrivate(List<T> elements){

    PriorityQueue<T> q = new PriorityQueue<>(elements);
    elements.clear();
    while (!q.isEmpty()){
        elements.add(q.poll());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...