Java 为什么此堆排序方法与<;T>;但不能使用通配符<>;?

Java 为什么此堆排序方法与<;T>;但不能使用通配符<>;?,java,generics,methods,wildcard,Java,Generics,Methods,Wildcard,由于这个任务,我已经用优先级队列实现了它。 我的问题是为什么它会这样工作: public <T> void heapSort(List<T> elements){ PriorityQueue<T> q = new PriorityQueue<>(elements); elements.clear(); while (!q.isEmpty()){ elements.add(q.poll()); } }

由于这个任务,我已经用优先级队列实现了它。 我的问题是为什么它会这样工作:

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

    elements.clear();
    while (!q.isEmpty()){
        elements.add(q.poll());
    }
}
public void堆(列出元素){
PriorityQueue q=新的PriorityQueue(元素);
元素。清除();
而(!q.isEmpty()){
元素。添加(q.poll());
}
}
但当我用通配符更改它时,它就停止工作了

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

    elements.clear();
    while (!q.isEmpty()){
        elements.add(q.poll());
    }
}
public void堆(列出元素){
PriorityQueue q=新的PriorityQueue(元素);
元素。清除();
而(!q.isEmpty()){
元素。添加(q.poll());
}
}
拜托,有人,给我解释一下为什么

通常,不能将
PriorityQueue
中的元素添加到
列表中,因为队列可能是
PriorityQueue
,而列表可能是
列表

编译器不会“记住”类型参数在这两种情况下是相同的,除非您创建一个类型变量来告诉它它们是相同的

以及如何修复它

您知道如何修复它:使用类型变量,如第一个代码示例中所示

如果您的意思是如何在方法签名中不包含类型变量,则可以委托给私有方法:

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());
    }
}
public void堆(列出元素){
heapSortPrivate(元素);
}
private void heapSortPrivate(列表元素){
PriorityQueue q=新的PriorityQueue(元素);
元素。清除();
而(!q.isEmpty()){
元素。添加(q.poll());
}
}

您在
中得到了什么错误消息?
?我建议您在一篇文章中说明这一原则(作为“捕获助手”),以帮助您更全面地理解这些概念。