2017-11-24 17 views
0

私は次のように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()); 
    } 
} 

私の質問

は次のとおりです。次のように私のコードがある

  1. なぜ型IteratorComparator <E extends Comparable<E>>のためのパラメータとクラスがEに直接ではなく、PeekingSortedIterator<E>上で動作するためではない<PeekingSortedIterator<E>>?私がそれをしたら、EがComparableを拡張する必要があることを指定する別の方法が必要だと理解していますが、IteratorComparator<E extends Comparable<E>>と比較メソッドがcompare(E e1, E e2)であったように思われるので混乱します。

  2. IteratorComparatorインスタンスが新しいIteratorComparator<E>()で作成されるのはなぜですか? new IteratorComparator<PeekingSortedIterator<E>>()に変更すると、コンパイル時エラー(Type mismatch: cannot convert from PriorityQueue<PeekingSortedIterator<PeekingSortedIterator<E>>> to PriorityQueue<PeekingSortedIterator<E>>)が表示されるのはなぜですか?

ありがとうございます!

+0

'>は型パラメータとしてコンパイルされません。そうする例を作ろうとすると、なぜこのようにしたのか分かります。 – bcsb1001

+0

クラスIteratorComparator 、E extends Comparable >がコンパレータ 'を実装する方が正しいでしょうか?それでも、クラスは2つの型のparamsを必要とするので、 'new IteratorComparator >()'を使うことはできません。 – TheWorldGoesRound

答えて

1

EIteratorComparator<E extends Comparable<E>>は、具体的なタイプではなくタイプ変数であることを理解する必要があります。

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

Comparable<E>(例えばString又はIntegerため、それ自体に匹敵)であり、いくつかのタイプEのクラスIteratorComparatorを宣言する。このクラスはComparator<PeekingSortedIterator<E>>を実装しており、2つを比較できることを意味します。PeekingSortedIterator<E>

+0

Thomasに感謝します。コンパイラに '>'を指定する必要がある場合、IteratorComparatorクラスはなぜなら、なぜなら、それは2 'PeekingSortedIteratorを比較するクラスだからです。または、コンパイラはクラスが 'PeekingSortedIterator'で動作することを既に知っているので、IteratorComparator >を指定する必要はありません'PeekingSortedIterator '? – TheWorldGoesRound

+0

@TheWorldGoesRoundは、 'Comparpleer >を実装することでクラスが比較するオブジェクトの種類をコンパイラに指示します(' PeekingSortedIterator ')。 'PeekingSortedIterator '自体に、( 'PeekingSortedIterator ')を指定するか、あなたのクラス( 'IteratorComparator ')を宣言する必要があるタイプパラメータ 'E'があります –