Java泛型类型参数混淆

时间:2017-11-24 03:07:46

标签: java generics

我创建了一个PriorityQueue,它按如下方式保存PeekingSortedIterators:

PriorityQueue<PeekingSortedIterator<E>> pq= new PriorityQueue<>(iterators.size(), new IteratorComparator<E>());
pq.offer(new PeekingSortedIterator<E>(si));

IteratorComparator比较PeekingSortedIterator的基础值。我的代码如下:

class IteratorComparator<E extends Comparable<E>> implements Comparator<PeekingSortedIterator<E>>{ // note generics!!!
    @Override
    public int compare(PeekingSortedIterator<E> o1, PeekingSortedIterator<E> o2) {
        return o1.peek().compareTo(o2.peek());
    } 
 }

我的问题如下:

  1. 为什么IteratorComparator <E extends Comparable<E>>而不是<PeekingSortedIterator<E>>的类型参数,因为该类在PeekingSortedIterator<E>上运行,而不是直接在E上运行?我明白,如果我这样做,那么我需要一种不同的方式来指定E需要扩展Comparable,但我很困惑因为IteratorComparator<E extends Comparable<E>>似乎比较方法应该是compare(E e1, E e2)

  2. 为什么使用新的IteratorComparator<E>()创建IteratorComparator实例?如果我将其修改为Type mismatch: cannot convert from PriorityQueue<PeekingSortedIterator<PeekingSortedIterator<E>>> to PriorityQueue<PeekingSortedIterator<E>>,为什么会出现编译时错误(new IteratorComparator<PeekingSortedIterator<E>>())?

  3. 提前致谢!

1 个答案:

答案 0 :(得分:1)

您必须了解E中的IteratorComparator<E extends Comparable<E>>不是具体类型,而是类型变量。

该行

class IteratorComparator<E extends Comparable<E>> 
    implements Comparator<PeekingSortedIterator<E>>{

为某些IteratorComparator类型E声明了一个类Comparable<E>(与自身相当,例如StringInteger)。此类实现Comparator<PeekingSortedIterator<E>>,这意味着它可以比较两个PeekingSortedIterator<E> s