2017-05-06 2 views
0

私は再入力する方法がわからないので、プライオリティキューとコンパレータのジェネリック型に問題があります。ジェネリック型と独自の比較器

私がcompare(IRecord t、IRecord t1) `メソッドを呼び出すと、IRecordオブジェクトが必要ですが、ジェネリック型を比較す​​る必要があります。

クラスAbstrPriorQueueはジェネリックでなければなりません。

は、オブジェクトIRecordで動作するコンパレータがあります:

public class MyComparator implements Comparator<IZaznam> { 

@Override 
public int compare(IRecord t, IRecord t1) { 
    if (t.getPriority() < t1.getPriority()) { 
     return -1; 
    } else if (t.getPriority() > t1.getPriority()) { 
     return 1; 
    } else { 
     return 0; 
    } 
    } 
} 

そして、これは私の短縮修道院キューです。私はコンストラクタにコンパレータを与えます。 IAbstrPriorQueueはインターフェイスのみです。

public class AbstrPriorQueue<T> implements IAbstrPriorQueue<T> { 
    // comparator 
    private MyComparator myComparator; 

    public AbstrPriorQueue(MyComparator myComparator) { 
      this.myComparator = myComparator; 
    } 

    @Override 
    public void insert(T data) { 
      T temp = list.getLast(); 

      // there is a error (no suitable method found for compare(T,T)) 
      if (myComparator.compare(data, temp) <= 0) { 
       // .... 
      } 
    } 
} 

私は何ができますか?

+1

(つまり、より多くの観客を集めて助けいうだけの理由で)あなたは「すべて英語」のコードを置くことによって開始します。 – GhostCat

答えて

2

エンドの誤解があります:あなたは不明ジェネリックタイプの要素のために固定コンパレータを使用することはできません!

リンゴにはしか使用できません。あなたはあらゆる種類のものを受け入れる箱の中でそれを使いたいと思っています。そのリンゴのコンパレータはどのようにバナナを比較するのか知っていなければなりませんか?または卵?

So; 1つの潜在的な方法は、あなたの "箱"をリンゴだけを受け入れるように変更することです。

public class AbstrPriorQueue<T extends IZaznam> 

などです。

意味:キューがIZaznamであるものだけを使用することを明確にする必要があります。または、その特定のコンパレータを使用することはできません。どちらか一方の方法。あなたはそれを両方向に持つことはできません。

しかし、最も可能性の高い、あなたはそれが他の方法でラウンドしたい:またジェネリックあるコンパレータ使用して:

あなたが見
public class AbstrPriorQueue<T> ... { 
    private final Comparator<T> komparator; 
    ... 

を、実際に一切ありませんコンパレータの種類を修正する必要がこのレベルで!

そして今、あなたはのために行くことができます:

AbstrPriorQueue<IZazname> izazies = new AbstrPriorQueuey<>(new Komparator()); 
+0

ありがとうございます。 – Michal

関連する問題