
1 redford42 2022 年 4 月 9 日 equals 不重写进行地址比较 |
2 falsemask 2022 年 4 月 9 日 ``` public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; } ``` |
3 GuuJiang 2022 年 4 月 9 日 via iPhone 假如兼容了的话会违背自反性,即 a.equals(b) == b.equals(a) |
4 MakHoCheung 2022 年 4 月 9 日 值类型和引用类型 eq 的区别 |
5 zpxshl 2022 年 4 月 9 日 via Android 应该期望是返回 true 吗 强行预期 |
6 otakustay 2022 年 4 月 9 日 比如你的逻辑是判断一个数和自己的一个 magic number 是否一样,一样的话给它加上 65536 ,很好一个 Integer 和你的 magic Long 一样,于是你加了,于是程序崩了 |
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; } } ``` |
8 jsdi 2022 年 4 月 9 日 个人理解,因为 equal 进行对象比较,对象的类型必须一直才有意义,Long 和 Integer 属于不同的类。 |
9 msaionyc 2022 年 4 月 9 日 via iPhone 如果你非要这样,可以自己写个 numberutil 。 |
10 Jooooooooo 2022 年 4 月 9 日 所以你的期望是错的呗. |
11 AllenHua 2022 年 4 月 9 日 Java 强类型语言,所以源码里一开始的判断就是用的 instanceof 关键字。类型都不一样肯定会返回 false 了,类型一样才会进一步比较值是否相等 |
12 kx5d62Jn1J9MjoXP 2022 年 4 月 9 日 via Android 其实是可以的,只是没有这样做 |
13 abc612008 2022 年 4 月 9 日 @zpxshl @Jooooooooo 从使用者(新用户)直觉角度来说,1L 难道不应该等于 1 吗?这就和 Java 字符串没法直接相等一样,是很反直觉的设计。你要是不想和 C++一样搞隐性类型转换,也可以和 Kotlin 一样直接报错啊。直接返回 false 算什么预期。 你要是遇到一个没见过的语言,写了个 "1"=="1" 或者 1 == 1L 你会下意识觉得这是 false ? |
14 EscYezi 2022 年 4 月 11 日 via iPhone It’s a feature,not a bug. |
16 bigbyto 2022 年 4 月 11 日 等价关系也称为同值关系(英语:Equivalence relation )即设 R 是某个集合 A 上的一个二元关系。若 R 满足以下条件: 自反性:xRx 对称性:xRy ==> yRx 传递性:xRy, yRz, xRz 上面就定义了 R 是某个集合 A 上的一个二元关系,但 Integer 和 Long 实际上是 2 个集合,可以理解为不同的东西,不具备等价关系。 比如 2147483648 在 Integer 就无法表达。 |