假设equals()是可传递的; 我理解,如果x和y具有相等的双边协议,那么其中一个,比如y,就不会与第三类z自己达成协议。 但如果我们的情况是x.equals(y)= false(仍然是可传递的)那么这与z的双边协议应该是什么?
答案 0 :(得分:5)
如果equals
方法正确实现,则按对象的javadoc要求:
- 它是自反的:对于任何非空引用值x,x.equals(x)应该返回true。
- 它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true 时,x.equals(y)应返回true。
- 它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals(z)应该返回。
- 它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是没有修改在对象上的equals比较中使用的信息。
- 对于任何非空引用值x,x.equals(null)应返回false。
我们可以推断x.equals(z)必须为false。
证明,如果equals()
是传递和对称的,则x.equals(y)为false且y.equals(z)为真:
1)假设x.equals(z)为真;
2)z.equals(y)为真(对称);
1 + 2)x.equals(y)为真(传递1和2)
但x.equals(y)的值为false,因此数字1或数字2必须是错误的,即x.equals(z)为false或函数不对称。
但如果equals()
没有实现对称,你就不能说结果x.equals(z)(参见其他答案;我对@Stephen C的评论答案)
答案 1 :(得分:2)
好:
x ≢ y
y ≡ z
因为equals()是可传递的,所以你可以用z代替y:
x ≢ z
因此,x.equals(z)为假。
编辑:它只是归结为布尔逻辑,它也是可传递的。
答案 2 :(得分:1)
@Colin HEBERT已经回答了这个问题。我只想指出OP混乱的可能来源。
这里实际上有两种不同的关系:
EQ关系(即x.equals(y) == true
)具有传递性。
NE关系(即x.equals(y) == false
)不具有传递性。
此外,传递属性只允许您推理涉及一个关系的链;即x EQ y && y EQ Z implies x EQ Z
。该问题尝试使用及物性来推理x NE y && y EQ z
...并且它不适用于该情况。
答案 3 :(得分:0)
只有两个主要的场景:
x.equals(y)的
y.equals(x)
if x.equals(z) then y.equals(z), z.equals(x), z.equals(y)
if !x.equals(z) then !y.equals(z), !z.equals(x), !z.equals(y)
!x.equals(y)的
!y.equals(x)
if x.equals(z) then !y.equals(z), z.equals(x), !z.equals(y)
if !x.equals(z) then !z.equals(x) // you can't know the rest for sure
答案 4 :(得分:0)
TO @Colin HEBERT: 这里的假设是equals()方法确实遵守等价关系契约。 因此,对于x和y对象,如果x.equals(y)返回false,则y.equals(x)也为false。这是它们之间的对称关系。现在为了传递性,如果我们有另一个对象z和y.equals(z)为真。 x.equals(z)应该在这个等价关系的上下文中返回什么,其中x.equals(y)和y.equals(x)返回false,为什么?