通用类型和自己的比较器
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());
我在优先队列和比较器中遇到通用类型问题,因为我不知道如何重新键入。
当我调用 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());