2016-07-30 12 views
-3

Entschuldigung, es ist sehr spät, damit ich nicht alle Details erklären kann, aber ich habe daran gearbeitet und ich kann nicht verstehen, warum das Objekt Objekt Verweis im Array nicht tut Verwenden Sie die Equals-Methode der Item-Klasse, die sie erhalten hat. Ich habe den Klassentyp der beiden Item-Objekte innerhalb der Funktion überprüft und sie geben die Klasse Item zurück.equals Methode nicht auf Objekt der definierten Klasse verwendet

import java.util.Arrays; 

class Item{ 
    private int data; 

    Item(int data){ 
     this.data=data; 
    } 

    public boolean equals(Item item){ 
     return data==item.data; 
    } 
    public String toString(){ 
     return String.format("{data: %d}", data); 
    } 
} 
public class Problem3{ 
    public static void main(String[] args){ 
     Object object=new Object(){ public String toString(){return String.format("{hash code: %d}", hashCode());} }; 
     String date="Friday, July 29"; 
     Item item=new Item(2); 

     Object[] array={"Fri, Jul 29", new Item(2), object, new Integer[]{212, 220, 240, 313, 316, 320, 323, 331}, new Double[]{Math.E, Math.PI, 9.80665}, new Boolean[]{true, true, true, true}, new String[]{"Eckhart", "Eric", "Owen", "Chris", "David", "Mark"}}; 
     System.out.println(Arrays.deepToString(array)); 
     System.out.println(); 

     System.out.println("Searching array for entries . . ."); 
     System.out.printf("\"%s\": %b\n", date, isMember(array, date)); 
     System.out.printf("%s: %b\n", item, isMember(array, item)); 
     System.out.printf("%s: %b\n", object, isMember(array, object)); 
     System.out.print("[\u0065, \u03c0, \u0047]: "+isMember(array, new Double[]{Math.E, Math.PI, 9.80665})); //\ud835 \u0065 
    } 
    private static boolean isMember(Object[] array, Object value){ 
     if(array.length>0){ 
      Object member=array[array.length-1]; 
      if(member instanceof Object[] && value instanceof Object[]){ 
       if(Arrays.deepEquals((Object[])member, (Object[])value)){ 
        return true; 
       } 
      } 
      else if(member.getClass().equals(Item.class) && value.getClass().equals(Item.class)){ 
       if(member.equals(value)){ 
        return true; 
       } 
      } 
      else if(member.equals(value)){ //Object parameter does not have field "data" of Item equals method, so "instance of Item" applied above 
       return true; 
      } 
      Object[] arrayNext=Arrays.copyOf(array, array.length-1); 
      return isMember(arrayNext, value); 
     } 

     return false; 
    } 
} 

Antwort

1

Die equals Methode hat die falsche Signatur und enthebt deshalb nicht die Object.equals Methode. Es sollte

sein
public boolean equals(Object item) 
+0

Okay, sicher, aber dann würde das Objekt Objektparameter von Gleichen nicht in der Lage sein, die Variable Object.data zu lösen, da es kein Mitglied oder Objekt ist. Wie würde ich eine equals-Methode erhalten, die Felder der Item-Klasse vergleichen kann? Artikelcast? –

+0

Ja, mit einem Cast; nachdem überprüft wurde, dass das Objekt der korrekten Klasse angehört. Gib false zurück, wenn nicht. – Henry

+0

Noch eine Sache ... können zwei anonyme Klassen von new Object() gleich sein? public boolean equals (Objektobjekt) { if (object.getClass(). equals (Item.class)) { \t Rückgabedaten == ((Objekt) -Objekt) .data; } Rückgabe false; } Überprüfung der Instanz des anonymen Klassenarguments und Rückgabe eines Flags für gleiche Felder, ähnlich wie bei meinem Code. Ich bin mir nicht sicher, ob das funktioniert. Wenn dies möglich ist, ist es, indem Sie die Felder jedes Objekts erhalten und ein tiefes Gleiches tun? –

1

Signature of equals Methode sollte

public boolean equals(Object obj)