我在优先级队列和我的比较器中遇到泛型类型的问题,因为我不知道如何重新键入。
当我调用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) {
// ....
}
}
}
你知道我能做什么吗?
答案 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());