簡體   English   中英

通用類型和自己的比較器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM