4

平等应该是对称的,对吧?

Object someObject = new Object();
Object NULL = null;

NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false

不让第二种形式抛出 a的理由是NullPointerException什么?

4

6 回答 6

4

在第一种情况下,equals() 方法不会抛出 NPE,因此您不能提出该论点。对称性是 equals() 方法契约的一部分。

于 2011-07-14T17:59:15.977 回答
2

在理论上,平等当然被定义为对称的,但它也根本没有在不存在的对象上定义(这就是 null 所代表的)。

因此,应用于 null 的任何行为都将同样有效。它可以返回一只活兔子,但仍然不与平等的理论定义相矛盾。

在这种情况下,代表 Java 设计者的一个非常合理的实现决定是,对 null 值调用 equals 应该抛出 NullPointerException,因为这与在 null 值上调用任何其他方法是一致的。

于 2011-07-14T18:03:11.060 回答
1

null因为在第二种情况下您没有访问对象的方法。不平衡的不是平等的概念,而是您访问它的方式。

于 2011-07-14T17:59:49.543 回答
0

第二个示例不是对称示例,因为它违反了关于 Object 和equals() 方法的简单规则之一:

对于任何非空引用值 x,x.equals(null) 应该返回 false。

于 2011-07-14T18:07:54.140 回答
0

我会去

someObject.equals(null);

不让第二种形式抛出 NullPointerException 的原因是什么?

在这种情况下,它不会抛出 NullPointerException。

在这里,我们确定equals()要调用的对象是NOT NULL.

于 2011-07-14T18:24:03.557 回答
0

第二位不会引发 NPE,因为您没有取消引用空指针。该代码返回 false,因为您正在将值与非值进行比较。

equals(null)将始终返回 false,因为没有空值之类的东西。null因为 Java 中不存在这个概念,所以 Object 和 Primitive 都不能有这个值。null是一个表示空引用的文字,这就是我们比较引用的原因,例如if (obj == null). 请参阅 Java 语言规范,第 3.10.7 节。换句话说,您将 的someObject空引用进行比较。

您可以创建自己的对象,覆盖equals并返回 true,但这会违反 Object.xml 中的定义。

于 2011-07-14T18:24:42.983 回答