通用类型和自己的比较器

时间:2017-05-06 07:26:09

标签: java generics 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) {
                // ....
          }
    }
}

你知道我能做什么吗?

1 个答案:

答案 0 :(得分:2)

您的结果存在误解:您无法将固定比较器用于未知通用类型的元素!

你有一个适用于苹果的比较器;但你想在一个接受各种事物的盒子里使用它。那个苹果比较器怎么会知道如何比较香蕉呢?还是鸡蛋?

因此;一种可能的方法是改变你的盒子&#34;只接受苹果。

public class AbstrPriorQueue<T extends IZaznam> 
例如,

含义:你必须明确你的队列只接受IZaznams。或者你不能使用那个特定的比较器。一种方式或另一种方式。你无法双管齐下。

但最有可能的是,你想要反过来:使用同样泛型的比较器

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

你知道,实际上没有需要在这个级别修复比较器的类型!

现在你可以选择:

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