#1 8. Oktober 2008 Generische Methode + equals = Problem Ich habe mir eine contains methode für Listen in Java geschrieben, da die Implementierte nicht richtig funktioniert und jetzt bemerke ich meine funktioniert auch nicht richtig Erstmal der Code: Code: public static <T> boolean contains(List<T> l, T in) { for(T c : l) { boolean bol = c.equals(in); if(bol) return true; } return false; } Das problem is ganz einfach es wird nicht die equals Methode in der Klasse aufgerufen sondern wie ich annehme die von Object. Da wir allerdings wissen das die Object equals methode nur wirklich dasselbe Objekt als gleich ansieht und nicht zum beispiel inhaltlich gleiche Objekte (wie es bei meinen Usern der Fall ist), führt das natürlich zu Problemen. Frage ist jetz kann ich den zwingen die equals methode zu verwenden? Natürlich könnte ich mir nen Interface schreiben und per Wildcards arbeiten, aber dann müsste jede Klasse vom interface erben und die Methode wäre nicht mehr allgmein gültig. + Multi-Zitat Zitieren
#2 8. Oktober 2008 AW: Generische Methode + equals = Problem dann mach doch getter und setter und sag z.b. c.getName().equals(t.getName()); dann hast das problem gelöst musst aber mehrere abfragen machen. oder du überschreibst einfach die equals methode + Multi-Zitat Zitieren
#3 8. Oktober 2008 AW: Generische Methode + equals = Problem Das Problem is die equals Methode is bereits überschrieben aber da die Abfrage generisch ist (schau dir den Code bitte mal an) wird diese von Object genommen, da meine Definitiv nicht ausgeführt wird! EDIT: Ich glaub ich weiß warum die Equals methode nicht ausgeführt wird, diese hatte wohl die falschen Argumente: public boolean equals(User u) anstatt public boolean equals(Object o) nur wie mach ich jetzt die abfrage? Vorheriger Code: Code: public boolean equals(User u) { if (name.equals(u.name)) return true; else return false; } + Multi-Zitat Zitieren
#4 8. Oktober 2008 AW: Generische Methode + equals = Problem also wenn du nur eine Liste mit "User"-Objekten hast und nun wissen willst ob dein User-Objekt drin vorkommt kannst du doch einfach: Code: List<User> userlist = new ArrayList<User>(); //bzw. new LinkedList<User>() User u = new User(); userlist.add(u); System.out.println("User drin? "+userlist.contains(u))); Wenn deine equals-Methode im User ungefähr so aussieht: Code: public boolean equals(Object o) { User u = (User)o; return this.name.equals(u.getName()); } Dann wird nun die überschriebene Equals-Methode deines Users beim Aufruf von contains aufgerufen. Hoffe ich konnte soweit helfen, falls noch Fragen sind, ruhig fragen ;-) + Multi-Zitat Zitieren
#5 8. Oktober 2008 AW: Generische Methode + equals = Problem Is aber gefährlich Nich sicher da equals wohl für Objekte gedacht ist: Ich denke mal das wäre die sichere Variante für mein Problem Code: public boolean equals(Object o) { try { User u = (User) o; return name.equals(u.name); }catch(Exception ex) { return false; } } Oder hat jemand noch ne bessere Idee? + Multi-Zitat Zitieren
#6 8. Oktober 2008 AW: Generische Methode + equals = Problem Also du wirst doch wohl nicht andere Objekte als User versuchen miteinander zu vergleichen, oder? Naja kommt auf deine Implementierung an, ansonsten schreibste deine equals halt so, wenn auf nummer sicher gehen willst: Code: public boolean equals(Object o) { if(o instanceof User){ User u = (User)o; return this.name.equals(u.getName()); }else{ return false; } } + Multi-Zitat Zitieren
#7 8. Oktober 2008 AW: Generische Methode + equals = Problem Nunja theoretisch will ich das nicht, aber die equals Methode lässt ja alle Objekte zu also sollte man Design and Contract mäßig auch alle Fälle abarbeiten Danke für deinen Code der ist wunderschön und nicht so dreckig wie meiner + Multi-Zitat Zitieren