有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    Please, someone, explain to me why?

    通常,不能将PriorityQueue<?>中的元素添加到List<?>,因为队列可能是PriorityQueue<String>,列表可能是List<Integer>

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

    and how to fix it.

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

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

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