在前言中,我在询问之前已经找了很多例子,找不到任何关于我的问题的解决方案。
我正在尝试在我正在制作的程序中实现一个通用队列,但是在某一点上停留了。我制作的程序应该模拟打印机,排队打印作业。有一个Queue类,PrintQueue类和作业类。 (重要的是要注意Job类包含一个作业ID和谁订购它的字符串。)我已经包含一个函数(在printQueue类中),如果第一个作业与作业ID匹配你输入,它将被删除。
不幸的是,队列是通用的。这意味着我不能仅使用整数遍历数组来检查等式,因为它是作业对象的队列。为了解决这个问题,我创建了一个空白名称和常规ID的作业。 Job类有一个equals方法,它确定ID或者是否匹配,然后它是true。但是当我执行代码时,不会调用此类。相反,调用泛型equals类,这当然是假的。看了这个网站上的很多例子后,我尝试了所有推荐的解决方案,这对我来说不起作用,因为我的情况(和问题)不同。我该怎么做才能覆盖通用的equals方法?下面的代码就像我可以在保持上下文时重现这个问题一样简单。
JOB CLASS
public class Job{
private String owner;
private int jobId;
public Job(String o, int j){
owner = o;
jobId = j;
}
public String getOwner(){
return owner;
}
public int getJobId(){
return jobId;
}
public String toString() {
return owner + " " + jobId + ". ";
}
public boolean equals(Job a) {
if(this.jobId == a.getJobId() || this.owner.equals(a.getOwner())) {
return true;
}
else
System.out.println("nomatch");
return false;
}
}
GENERIC QUEUE CLASS
import java.util.ArrayList;
public class Queue<T>{
private ArrayList<T> queue;
public Queue() {
queue = new ArrayList<T>();
}
public void enQueue(T obj1) {
queue.add(obj1);
}
public T deQueue() {
if(queue.size() != 0) {
T temp = queue.get(queue.size() - 1);
queue.remove(queue.size() -1);
return temp;
}
else
return null;
}
public int size() {
return queue.size();
}
public boolean isEmpty() {
if (size() == 0) {
return true;
}
else
return false;
}
public int positionOf(T a) {
for(int x = 0; x < queue.size(); x++) {
if(a.equals(queue.get(x))) {
System.out.println("Positionmatch");
return x;
}
}
return -1;
}
}
PRINTQUEUE CLASS
public class PrintQueue {
Queue<Job> prqueue = new Queue<Job>();
public PrintQueue() {}
public void lprm(int jobID) { //Removes the active job at the front of the queue if jobId matches, error message otherwise
//I can't JUST use jobID to check the position because the queue is a collection of JOBS not JobId's
if (prqueue.positionOf(new Job("",jobID))==0) {
prqueue.deQueue();
}
else if (prqueue.positionOf(new Job("",jobID))== -1) {
System.out.println("Job does not occupy first row.");
}
}
}
我知道这是一个广泛的问题,所以如果你花时间阅读它,非常感谢你。如果我能在其他任何地方找到答案,我不会问这个。
答案 0 :(得分:1)
解决方案很简单:你不是在你的班级中压倒平等,这是常见的错误。始终使用@Override
为您的方法添加注释,以避免出现此错误。
真实equals
方法正在使用Object
参数,您的参数有Job
,将其更改为Object
,然后相应地投射。
如果您使用的是IDE,我建议使用right click -> source -> generate equals
,您将看到一个很好的示例。
答案 1 :(得分:0)
你必须覆盖你的方法
@Override
public boolean equals(Object a) {
if(!(a instanceof Job))
throw new IllegalArgumentException();
Job job =(Job)a;
if(this.jobId == job.getJobId() || this.owner.equals(job.getOwner())) {
return true;
}
else
System.out.println("nomatch");
return false;
}
另见Why do I need to override the equals and hashCode methods in Java?