gpt4 book ai didi

java - 通用类型和自己的比较器

转载 作者:行者123 更新时间:2023-12-02 02:51:14 25 4
gpt4 key购买 nike

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

当我调用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 只是一个接口(interface)。

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> 
例如。

含义:你必须明确你的队列只接受 IZaznam 的东西。或者您无法使用该特定比较器。一种方式或另一种方式。你不能两全其美。

但最有可能的是,您想要相反的方式:通过使用也是通用的比较器:

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

你看,实际上不需要需要修复这个级别的比较器类型!

现在您可以选择:

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

关于java - 通用类型和自己的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43817885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com