【问题标题】:equals method not being used on object of defined class [duplicate]未在已定义类的对象上使用等于方法[重复]
【发布时间】:2016-07-30 07:35:28
【问题描述】:

对不起,已经很晚了,所以我可能无法解释所有细节,但是我一直在研究这个,我不明白为什么数组中的对象 Item 对象引用不使用它的 Item 类的 equals 方法被给予。我检查了函数内两个 Item 对象的类类型,它们返回类 Item。

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;
    }
}

【问题讨论】:

    标签: java class interface


    【解决方案1】:

    equals 方法的签名错误,因此不会覆盖Object.equals 方法。应该是

    public boolean equals(Object item)
    

    【讨论】:

    • 好的,但是equals的Object对象参数将无法解析变量Object.data,因为它不是成员或对象。我将如何获得一个可以比较 Item 类的字段的 equals 方法?物品投射?
    • 是的,有演员表;在检查对象是否属于正确的类之后。如果不是,则返回 false。
    • 还有一件事......来自 new Object() 的两个匿名类可以相等吗? public boolean equals(Object object){ if(object.getClass().equals(Item.class)){ return data==((Item)object).data; } 返回假;检查匿名类参数的实例并返回相等字段的标志,类似于我的代码,我不确定是否会起作用。如果这是可能的,是不是通过获取每个对象的字段并进行深度等于?
    • 不确定我是否正确理解了这个问题,但为了能够转换为 Item,匿名类必须派生自 Item 而不是 Object
    • Object 类型的两个直接继承者(匿名内部类),具有相等的字段值:是否有相等或其他方式来确定
    【解决方案2】:

    您不会覆盖 Object 类中的 equals。看这里: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

    public boolean equals(Object obj)
    

    要覆盖 Java 中的方法,您必须使用相同的方法签名。您的参数是 Item 而不是 Object。

    【讨论】:

      【解决方案3】:

      equals 方法的签名应该是

      public boolean equals(Object obj)
      

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 2016-08-14
        • 2013-02-01
        • 2014-11-22
        • 1970-01-01
        • 2020-09-07
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多