2017-05-06 51 views
0

我有優先級隊列和我的比較器泛型類型的問題,因爲我不知道如何重新鍵入。泛型類型和自己的比較器

當我調用比較(IRecord t,IRecord t1)方法時,它需要IRecord對象,但我需要比較泛型類型。

Class 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

有您的最終一個誤解:你不能用一個固定比較未知通用類型的元素!

你有一個比較器,只有適用於蘋果;但你想在一個接受各種事物的盒子裏使用它。蘋果比較者應該如何知道如何比較香蕉?還是雞蛋?

所以;一種可能的方式是將您的「盒子」改爲只接受蘋果。

public class AbstrPriorQueue<T extends IZaznam> 

例如。

含義:你必須明確指出你的隊列只包含IZaznams的東西。或者你不能使用特定的比較器。一種方式或其他。你不能兩面都有。

但最有可能的,你希望它倒過來:通過比較,這也是通用

public class AbstrPriorQueue<T> ... { 
    private final Comparator<T> komparator; 
    ... 

你看,居然有沒有,需要修正比較器的類型在這個層面!

現在你可以去:

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

非常感謝。 – Michal