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