私は次のようにPeekingSortedIteratorsを保持している優先度つきキューを作成しました:のJavaのジェネリック型パラメータの混乱
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());
}
}
私の質問
は次のとおりです。次のように私のコードがあるなぜ型
IteratorComparator <E extends Comparable<E>>
のためのパラメータとクラスがEに直接ではなく、PeekingSortedIterator<E>
上で動作するためではない<PeekingSortedIterator<E>>
?私がそれをしたら、EがComparableを拡張する必要があることを指定する別の方法が必要だと理解していますが、IteratorComparator<E extends Comparable<E>>
と比較メソッドがcompare(E e1, E e2)
であったように思われるので混乱します。IteratorComparatorインスタンスが新しい
IteratorComparator<E>()
で作成されるのはなぜですか?new IteratorComparator<PeekingSortedIterator<E>>()
に変更すると、コンパイル時エラー(Type mismatch: cannot convert from PriorityQueue<PeekingSortedIterator<PeekingSortedIterator<E>>> to PriorityQueue<PeekingSortedIterator<E>>
)が表示されるのはなぜですか?
ありがとうございます!
'>は型パラメータとしてコンパイルされません。そうする例を作ろうとすると、なぜこのようにしたのか分かります。 –
bcsb1001
クラスIteratorComparator、E extends Comparable >がコンパレータ 'を実装する方が正しいでしょうか?それでも、クラスは2つの型のparamsを必要とするので、 'new IteratorComparator >()'を使うことはできません。 –
TheWorldGoesRound