Java 及物性关系:当x.equals(y)为假而y.equals(z)为真时,x.equals(z)是什么
假设equals()是可传递的; 我理解,如果x和y有一个平等的双边协议,那么其中一个,比如y,不会单独与第三类z签订协议。但是如果我们的情况是x.equals(y)=false(仍然可以传递),那么这个与z的双边协议应该是什么呢Java 及物性关系:当x.equals(y)为假而y.equals(z)为真时,x.equals(z)是什么,java,logic,equals,equality,Java,Logic,Equals,Equality,假设equals()是可传递的; 我理解,如果x和y有一个平等的双边协议,那么其中一个,比如y,不会单独与第三类z签订协议。但是如果我们的情况是x.equals(y)=false(仍然可以传递),那么这个与z的双边协议应该是什么呢 x ≢ y y ≡ z 由于equals()是可传递的,因此可以将y替换为z: x ≢ z 因此,x.equals(z)是错误的 编辑:可以归结为布尔逻辑,它也是可传递的。只有两个主要场景: x、 等于(y) !!x、 等于(y) @科林·赫伯特已经回答了这个
x ≢ y
y ≡ z
由于equals()是可传递的,因此可以将y替换为z:
x ≢ z
因此,x.equals(z)是错误的
编辑:可以归结为布尔逻辑,它也是可传递的。只有两个主要场景:
@科林·赫伯特已经回答了这个问题。我只想指出OP困惑的一个可能来源 这里实际上有两种不同的关系:
- 等式关系(即
)是可传递的x.equals(y)=true
- NE关系(即
)是不可传递的x.equals(y)=false
此外,传递性属性只允许您对涉及一个关系的链进行推理;i、 e.
x EQ y和&y EQ Z意味着x EQ Z
。这个问题试图用及物性来解释xney&&yeqz
。。。它不适用于这种情况。如果按照对象的javadoc要求正确实现了equals
方法:
- 它是自反的:对于任何非空参考值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)应该返回true
- 它是一致的:对于任何非空的引用值x和y,x.equals(y)的多次调用始终返回true或false,前提是没有修改对象上equals比较中使用的信息
- 对于任何非空引用值x,x.equals(null)应返回false李>
equals()
是可传递且对称的,则x.equals(y)为假,y.equals(z)为真:
1) 假设x.equals(z)为真2) z.equals(y)为真(对称)
1+2)x.equals(y)为真(传递的1和2) 但是x.equals(y)是假的,所以数字1或数字2一定是错的,也就是说,x.equals(z)是假的,或者函数是不对称的 但是如果
equals()
没有实现对称,那么就不能对结果x.equals(z)说任何话(参见其他答案;我对@Stephen C answer的评论)到@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,为什么?等等。如果x和y不同,y和z之间的关系是什么?如果x.equals(y)=true,我想这个问题会更有趣。
x
、y
和z
类或实例也是这样吗?如果是这样的话,你应该使用大写字母,否则会让人困惑。举个例子:使用“大于”,它也是可传递的:A>B
和B>C
意味着在A>C
中。但是如果我们有A C
我们不能说A C
,两者都是可能的。正如你可能知道或不知道的那样,x==y
和x.equals(y)
在Java中是不等价的。问题是关于equals(Object)
方法的,所以为了避免混淆,我不会在回答中使用==
操作符,即使是作为equals(Object)
的简写符号。我只使用了=
和=因为它们是标准的逻辑运算符,问题是x
是否等于z
。如何实现equals()并不重要,因为基本规则与布尔逻辑相同≡代码>和≢代码>,或⇔代码>和⇎代码>。也许只是我,但在Java上下文中,交替使用=
和equals
是非常误导人的。注意:我并不是说你的答案是错误的,但是这个答案可能会让阅读它的Java新手感到困惑。我也更喜欢那些符号,只是我不知道如何键入它们。我想我会相应地更新我的帖子。
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)
!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