在Java-getClass()方法中重写equals

在Java-getClass()方法中重写equals,java,overriding,equals,equality,Java,Overriding,Equals,Equality,在本文中,我们详细解释了如何使用getClass在Java中编写适当的相等方法来比较我们相等的两个对象的运行时类型。我理解我们这样做的原因是为了确保如果B扩展了A,我们想要A.equals(B)=B.equals(A)(自反性) 在我看来,它确实提供了一个很大的限制。如果你有一个对象集合a,检查一些B对象,因为它们是a的子类,那么a.equals(B)总是假的。。。也许,在某些时候,我们应该坚持使用旧的instanceof操作符来提供多态性并允许子类型相等?你的想法是什么 您只需查看java.u

在本文中,我们详细解释了如何使用getClass在Java中编写适当的相等方法来比较我们相等的两个对象的运行时类型。我理解我们这样做的原因是为了确保如果B扩展了A,我们想要A.equals(B)=B.equals(A)(自反性)


在我看来,它确实提供了一个很大的限制。如果你有一个对象集合a,检查一些B对象,因为它们是a的子类,那么a.equals(B)总是假的。。。也许,在某些时候,我们应该坚持使用旧的
instanceof
操作符来提供多态性并允许子类型相等?你的想法是什么

您只需查看
java.util
就可以看到将
.equals()
重新定义为只关心接口的示例。例如,定义了相关特征等式,并明确记录了计算哈希代码的公式


所以要回答你的问题,是的——忽略子类型在某些情况下是有意义的。但我喜欢Josh Bloch的方法,他将接口作为等价的一个方面。

事实并非如此。例如,如果您查看JDK中的集合,它们使用了一个不太严格的相等定义。下面的代码两次输出“true”。最后,这是一个合同和文件的问题

(我的重点):

比较指定对象与此列表是否相等。当且仅当指定对象也是列表、两个列表的大小相同且两个列表中所有对应的元素对相等时,返回true。(如果(e1==null?e2==null:e1.equals(e2)),则两个元素e1和e2是相等的。)换句话说,如果两个列表以相同的顺序包含相同的元素,则将它们定义为相等此定义确保equals方法在列表接口的不同实现中正常工作。

请注意,只要所有实现
列表的类都遵守该契约,它就不会违反自反性要求

public static void main(String[] args) {
    List<String> list1 = new ArrayList<String>();
    list1.add("a");

    List<String> list2 = new LinkedList<String>();
    list2.add("a");

    List<String> list3 = Arrays.asList("a");

    System.out.println("arraylist = linkedlist? " + list1.equals(list2));
    System.out.println("arraylist = Arrays.aslit? " + list1.equals(list3));
}
publicstaticvoidmain(字符串[]args){
List list1=新的ArrayList();
清单1.添加(“a”);
List list2=新链接列表();
清单2.添加(“a”);
List list3=Arrays.asList(“a”);
System.out.println(“arraylist=linkedlist?”+list1.equals(list2));
System.out.println(“arraylist=Arrays.aslit?”+list1.equals(list3));
}

…是的。你说的很清楚是真的。有什么问题吗?我没有任何具体的问题,我想知道是否有一种做法会一直受到青睐,我是否错过了一个重要的一点