【问题标题】:Why does this heap sort method work with <T> but not with a wildcard <?>?为什么这种堆排序方法适用于 <T> 而不适用于通配符 <?>?
【发布时间】:2020-03-09 19:08:13
【问题描述】:

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

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());
    }
}

【问题讨论】:

  • ? 收到什么错误消息?

标签: java generics methods wildcard


【解决方案1】:

请有人给我解释一下为什么?

一般来说,您不能将PriorityQueue&lt;?&gt; 中的元素添加到List&lt;?&gt;,因为队列可能是PriorityQueue&lt;String&gt;,而列表可能是List&lt;Integer&gt;

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

以及如何解决它。

您知道如何解决它:使用类型变量,如第一个代码示例所示。

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

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());
    }
}

【讨论】:

猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
相关资源
最近更新 更多