为什么 Java 的 Long.equals 的方法不能兼容 Integer 呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
butterflyzh

为什么 Java 的 Long.equals 的方法不能兼容 Integer 呢?

  •  
  •   butterflyzh 2022 年 4 月 9 日 2817 次点击
    这是一个创建于 1476 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如:Long val1 = new Long(10000L);
    Integer val2 = new Integer(10000);
    val1.equals(val2);
    应该期望是返回 true 啊,但是返回的 false 。这算是 JDK 的 bug 吗
    17 条回复    2022-04-11 14:57:57 +08:00
    redford42
        1
    redford42  
       2022 年 4 月 9 日
    equals 不重写进行地址比较
    falsemask
        2
    falsemask  
       2022 年 4 月 9 日
    ```
    public boolean equals(Object obj) {
    if (obj instanceof Long) {
    return value == ((Long)obj).longValue();
    }
    return false;
    }
    ```
    GuuJiang
        3
    GuuJiang  
       2022 年 4 月 9 日 via iPhone   9
    假如兼容了的话会违背自反性,即 a.equals(b) == b.equals(a)
    MakHoCheung
        4
    MakHoCheung  
       2022 年 4 月 9 日
    值类型和引用类型 eq 的区别
    zpxshl
        5
    zpxshl  
       2022 年 4 月 9 日 via Android
    应该期望是返回 true 吗
    强行预期
    otakustay
        6
    otakustay  
       2022 年 4 月 9 日
    比如你的逻辑是判断一个数和自己的一个 magic number 是否一样,一样的话给它加上 65536 ,很好一个 Integer 和你的 magic Long 一样,于是你加了,于是程序崩了
    loshine1992
        7
    loshine1992  
       2022 年 4 月 9 日
    JDK Long 的源码

    ```java
    public boolean equals(Object obj) {
    if (obj instanceof Long) {
    return this.value == (Long)obj;
    } else {
    return false;
    }
    }
    ```
    jsdi
        8
    jsdi  
       2022 年 4 月 9 日
    个人理解,因为 equal 进行对象比较,对象的类型必须一直才有意义,Long 和 Integer 属于不同的类。
    msaionyc data-uid=
        9
    msaionyc  
       2022 年 4 月 9 日 via iPhone
    如果你非要这样,可以自己写个 numberutil 。
    Jooooooooo
        10
    Jooooooooo  
       2022 年 4 月 9 日
    所以你的期望是错的呗.
    AllenHua
        11
    AllenHua  
       2022 年 4 月 9 日
    Java 强类型语言,所以源码里一开始的判断就是用的 instanceof 关键字。类型都不一样肯定会返回 false 了,类型一样才会进一步比较值是否相等
    kx5d62Jn1J9MjoXP
        12
    kx5d62Jn1J9MjoXP  
       2022 年 4 月 9 日 via Android
    其实是可以的,只是没有这样做
    abc612008
        13
    abc612008  
       2022 年 4 月 9 日   1
    @zpxshl @Jooooooooo 从使用者(新用户)直觉角度来说,1L 难道不应该等于 1 吗?这就和 Java 字符串没法直接相等一样,是很反直觉的设计。你要是不想和 C++一样搞隐性类型转换,也可以和 Kotlin 一样直接报错啊。直接返回 false 算什么预期。

    你要是遇到一个没见过的语言,写了个 "1"=="1" 或者 1 == 1L 你会下意识觉得这是 false ?
    EscYezi
        14
    EscYezi  
       2022 年 4 月 11 日 via iPhone
    It’s a feature,not a bug.
    bigbyto
        15
    bigbyto  
       2022 年 4 月 11 日
    @GuuJiang 额..你例子说的没错,不过这个是对称性。自反是 x.equals(x) == true 。
    bigbyto
        16
    bigbyto  
       2022 年 4 月 11 日
    等价关系也称为同值关系(英语:Equivalence relation )即设 R 是某个集合 A 上的一个二元关系。若 R 满足以下条件:

    自反性:xRx
    对称性:xRy ==> yRx
    传递性:xRy, yRz, xRz

    上面就定义了 R 是某个集合 A 上的一个二元关系,但 Integer 和 Long 实际上是 2 个集合,可以理解为不同的东西,不具备等价关系。 比如 2147483648 在 Integer 就无法表达。
    GuuJiang
        17
    GuuJiang  
       2022 年 4 月 11 日 via iPhone
    @bigbyto 是的,口误了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     878 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 20:49 PVG 04:49 LAX 13:49 JFK 16:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86