[英]Generic type and own comparator
優先級隊列和比較器中的通用類型有問題,因為我不知道如何重新輸入。
當我調用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) {
// ....
}
}
}
你知道我能做什么嗎?
最終會有一個誤解:您不能對未知通用類型的元素使用固定的比較器!
您有一個僅適用於蘋果的比較器。 但您想在一個可以容納所有事物的盒子中使用它。 該蘋果比較器應該如何知道如何比較香蕉? 還是雞蛋?
所以; 一種可能的方法是將“盒子”更改為僅接受蘋果。
public class AbstrPriorQueue<T extends IZaznam>
例如。
含義:您必須明確說明您的隊列僅包含IZaznams。 或者,您不能使用該特定的比較器。 一種或另一種方式。 您不能同時擁有這兩種方式。
但最有可能的是,您希望以另一種方式使用它:通過使用也是通用的比較器:
public class AbstrPriorQueue<T> ... {
private final Comparator<T> komparator;
...
您會看到,實際上沒有必要在此級別上固定比較器的類型!
現在您可以申請:
AbstrPriorQueue<IZazname> izazies = new AbstrPriorQueuey<>(new Komparator());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.