Java 及物性关系:当x.equals(y)为假而y.equals(z)为真时,x.equals(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) @科林·赫伯特已经回答了这个

假设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)


  • @科林·赫伯特已经回答了这个问题。我只想指出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
    我们可以推断x.equals(z)一定是假的

    证明,如果
    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