java为什么这个堆排序方法可以使用<T>而不能使用通配符?
由于这个任务,我已经用优先级队列实现了它。 我的问题是为什么它会这样工作:
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 楼答案
通常,不能将
PriorityQueue<?>
中的元素添加到List<?>
,因为队列可能是PriorityQueue<String>
,列表可能是List<Integer>
编译器不会“记住”类型参数在这两种情况下是相同的,除非您创建一个类型变量来告诉它它们是相同的
您知道如何修复它:使用类型变量,如第一个代码示例中所示
如果您的意思是如何在方法签名中不包含类型变量,则可以委托给私有方法: