证明A == B,B == C,A!= C.

Ach*_*les 2 java algorithm logic

是否存在传递法不能成立的对象或原始类型; 例如

A == B,B == C但A!= B.

我不是在谈论equals()方法.我对==操作感兴趣

我们能证明这一点吗?

Pau*_*kin 9

干得好.A==BB==C导致Floats被提升为float,因此==返回true.但是,A==C引用相等,这是错误的.

    Float A = new Float(1.0f);
    float B = 1.0f;
    Float C = new Float(1.0f);
    System.out.println(A==B);
    System.out.println(B==C);
    System.out.println(A==C);
Run Code Online (Sandbox Code Playgroud)

Float在这里并不特别,它可以很容易IntegerBoolean.

以下是语言规范的相关部分:

15.21.1.数值等式算子==和!=

如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)为数字类型,则对操作数执行二进制数字提升(第5.6.2节).

15.21.3.参考等式运算符==和!=

如果等于运算符的操作数既是引用类型又是null类型,则操作是对象相等.

这是第二个反例,这次使用比较a longfloat使用float比较完成的事实.

        long a = 99999999999999L;
        float b = 99999999999999.0f;
        long c = 99999999999998L;
        System.out.println(a==b);
        System.out.println(b==c);
        System.out.println(a==c);
Run Code Online (Sandbox Code Playgroud)

第三,我认为即使A,B和C属于同一类型,理论上也可能存在非传递性.

如果A和C是双扩展指数值(与它们的最接近的两倍具有相同的值B),那么当计算A == B和B == C时,语言实现可以选择舍入A和C到它们最近的双精度值(即B).它也可能选择在进行A == C到圆.比较必须在未标记为FP严格的上下文中完成

基本上"5.1.13.值集转换"为Java提供了非FP严格浮点/双精度计算的有限实现定义行为集,并且可以利用这一点(至少在理论上)来找到相等的反例传递.