Pour préface, j'ai cherché de nombreux exemples avant de demander et ne trouve pas de solution en ce qui concerne mon problème. J'essaye d'implémenter une file d'attente générique dans un programme que je fais, mais bloqué à un certain point. Le programme que j'ai fait est supposé simuler une imprimante, mise en file d'attente avec des travaux d'impression. Il existe une classe de file d'attente, une classe PrintQueue et une classe de travail. (Il est important de noter que la classe Job se compose d'un ID de travail et d'une chaîne de caractères qui l'a ordonnée). J'ai inclus une fonction (dans la classe printQueue) où si le premier travail correspond à l'ID du travail que vous avez entré, il sera supprimé.Surcharge générique équals méthode
Malheureusement, la file d'attente est générique. Cela signifie que je ne peux pas traverser le tableau avec juste un entier pour vérifier l'égalité car il s'agit d'une file d'attente d'objets de travail. Pour résoudre ce problème, je crée un travail avec un nom vide et un identifiant normal. La classe Job a une méthode égale, qui détermine si l'ID ou le propriétaire correspond, alors c'est vrai. Mais quand j'exécute le code, cette classe n'est pas appelée. La classe générique égale est appelée à la place, ce qui sera bien sûr faux. Après avoir regardé de nombreux exemples sur ce site, j'ai essayé toutes les solutions recommandées, ce qui n'a pas fonctionné pour moi car mon cas (et mon problème) sont différents. Que puis-je faire pour remplacer la méthode générique égale? Mon code ci-dessous est aussi simple que je pourrais le faire pour reproduire ce problème tout en gardant le contexte.
EMPLOI CLASSE
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;
}
}
GÉNÉRIQUE QUEUE CLASSE
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 CLASSE
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.");
}
}
}
Je sais que ce C'est une question vaste, donc si vous prenez le temps de le lire merci beaucoup. Je ne le demanderais pas si je pouvais trouver la réponse ailleurs.
lorsque vous substituez vous devez remplacer égale aussi la méthode –
** Vous êtes pas ** hashCode() remplaçant les égaux méthodes dans votre classe Job. La signature de méthode correcte est 'public boolean equals (Object obj)'. Il doit prendre un objet en paramètre. Si vous aviez utilisé l'annotation @Override, vous auriez probablement repéré cette erreur par vous-même. –
J'avais utilisé @Override mais je suppose que je n'ai pas compris le message d'erreur. Merci –