[Java] Generische Methode + equals = Problem

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Korona, 8. Oktober 2008 .

Schlagworte:
  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.
     
  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
     
  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;
     }
    
     
  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 ;-)
     
  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?
     
  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;
     }
     }
    
     
  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
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.