通用类型和自己的比较器

Generic type and own comparator

我在优先队列和比较器中遇到通用类型问题,因为我不知道如何重新键入。

当我调用 compare(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) {
                // ....
          }
    }
}

你知道我能做什么吗?

您这边有一个误解:您不能对 未知通用 类型的元素使用 固定 比较器!

您有一个适用于苹果的比较器;但是您想在一个可以容纳各种东西的盒子中使用它。苹果比较器怎么知道如何比较香蕉呢?还是鸡蛋?

所以;一种可能的方法是将 "box" 更改为仅接受苹果。

public class AbstrPriorQueue<T extends IZaznam> 

例如。

意思是:你必须明确你的队列只接受 IZaznams 的东西。或者你不能使用那个特定的比较器。一种或另一种方式。不能两全其美。

但最有可能的是,您希望反过来:通过使用也是 generic:

的比较器
public class AbstrPriorQueue<T> ... {
  private final Comparator<T> komparator;
  ...

你看,其实不需要在这一层修改比较器的类型!

现在你可以去:

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