传递关系:当 x.equals(y) 为 false 且 y.equals(z) 为 true 时,x.equals(z) 是什么
假设 equals() 是传递的; 我理解,如果 x 和 y 具有平等的双边协议,那么其中一个(例如 y)不会单独与第三类 z 签订协议。 但是,如果我们遇到 x.equals(y) = false(仍然具有传递性)的情况,那么与 z 的双边协议应该是什么?
Assuming equals() is transitive;
I understand that if x and y, have a bilateral agreement of being equal, then one of them, say y, does not enter into an agreement with a third class z on its own. But if we have a situation where x.equals(y) = false (still transitive) then what should this bilateral agreement with z be?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果
equals
方法按照 Object 的 javadoc 的要求正确实现:我们可以推断 x.equals(z) 一定是 false。
证明,如果
equals()
是传递且对称的,则 x.equals(y) 为 false,y.equals(z) 为 true:1) 假设 x.equals(z) 为 true;
2) z.equals(y) 为真(对称);
1+2) x.equals(y) 为 true(传递 1 和 2),
但 x.equals(y) 给出为 false,因此数字 1 或数字 2 一定是错误的,即 x.equals(z) 是false 或函数不对称。
但是,如果
equals()
没有实现为对称的,那么您就无法对结果 x.equals(z) 说任何话(请参阅其他答案;我对 @Stephen C 答案的评论)If the
equals
method is correctly implemented, as demanded by the javadoc of Object:we can infer that x.equals(z) must be false.
Prove, if
equals()
is transitive and symmetric, x.equals(y) is false and y.equals(z) is true:1) assuming x.equals(z) is true;
2) z.equals(y) is true (symmetry);
1+2) x.equals(y) is true (transitive 1 and 2)
but x.equals(y) is given as false, so number 1 or number 2 must be wrong, that is, x.equals(z) is false or the function is not symmetric.
But if
equals()
is not implemented to be symmetric, you can't say anything about the result x.equals(z) (see other answers; my comment on @Stephen C answer)好吧:
由于 equals() 是传递性的,因此您可以将 y 替换为 z:
因此,x.equals(z) 为 false。
编辑:它只是归结为布尔逻辑,它也是传递的。
Well:
since equals() is transitive, you can replace y with z:
Therefore, x.equals(z) is false.
Edit: It just comes down to boolean logic, which is also transitive.
@Colin HEBERT 已经回答了这个问题。我只想指出OP混乱的一个可能根源。
这里实际上有两种不同的关系:
EQ 关系(即
x.equals(y) == true
)是传递性的。NE 关系(即 x.equals(y) == false)是不可传递的。
此外,传递性属性仅允许您推理涉及一种关系的链;即
x EQ y && y EQ Z 意味着 x EQ Z
。该问题尝试使用传递性来推理 x NE y && y EQ z ...并且它不适用于这种情况。@Colin HEBERT has answered this. I'd just like to point out a possible source of the OP's confusion.
There are actually two different relations here:
the EQ relation (i.e.
x.equals(y) == true
) is transitive.the NE relation (i.e.
x.equals(y) == false
) is NOT transitive.Furthermore, the transitivity property only allows you to reason about to chains involving one relation; i.e.
x EQ y && y EQ Z implies x EQ Z
. The question tries to use transitivity to reason aboutx NE y && y EQ z
... and it doesn't apply to that case.只能有两种主要场景:
x.equals(y)
!x.equals(y)
There can be only two main scenarii:
x.equals(y)
!x.equals(y)
致@科林·赫伯特:
这里的假设是 equals() 方法确实遵守等价关系契约。
因此,对于对象 x 和 y,如果 x.equals(y) 返回 false,则 y.equals(x) 也为 false。这就是它们之间的对称关系。现在对于传递性,如果我们有另一个对象 z 并且 y.equals(z) 为 true。在 x.equals(y) 和 y.equals(x) 返回 false 的等价关系上下文中,x.equals(z) 应该返回什么,为什么?
TO @Colin HEBERT:
The assumption here is that equals() method does abide by the contract of equivalence relation.
So for objects x and y if x.equals(y) returns false then y.equals(x) is also false. This is the symmetric relationship between them. Now for transitivity, if we have another object z and y.equals(z) is true. What should x.equals(z) return in context of this equivalence relation where x.equals(y) and y.equals(x) return false, and why?