Java Optional 是否与 Map equals 实现不兼容?
Is Java Optional incompatible with Map equals implementations?
我有 Map<Long, Optional<Throwable>>
的实例(使用 ImmutableMap 实例化。of/copyOf 来自其他表示形式,例如 HashMap)。调试时实例看起来相同,我正在尝试使用 .equals 在单元测试中进行比较。我想我可能已经找到问题所在,但想确认一下。
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.
据我了解,在大多数情况下,Map 相等性的实现依赖于(至少?)value 参数的哈希码实现,所以我认为这可能就是 .equals 调用在这里失败的原因.虽然它说 "may have",但我很想知道这是否仍然适用于基本用例,并且对于某些特定的边缘情况更需要注意,或者这是否就是原因。
(我也许还应该指出我使用的是 eclipse 源代码生成器提供的默认 equals/hashcode 实现)
This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.
您引用的问题还不存在。该警告是为 value bases classes 做准备,可能会出现在 Java 10 或更高版本中。
不清楚你的问题是什么,但它肯定不那么奇特。这些是常见的陷阱(部分摘自评论):
- 混淆
int
和 long
- 比较
Throwable
和 Optional<Throwable>
:它们绝不能相等
- 比较两个
Throwable
s:因为他们通常不实现 equals
,这很没有意义
我建议创建一个简单的 class,其中包含 Throwable
中的相关字段,然后改用它。
我有 Map<Long, Optional<Throwable>>
的实例(使用 ImmutableMap 实例化。of/copyOf 来自其他表示形式,例如 HashMap)。调试时实例看起来相同,我正在尝试使用 .equals 在单元测试中进行比较。我想我可能已经找到问题所在,但想确认一下。
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.
据我了解,在大多数情况下,Map 相等性的实现依赖于(至少?)value 参数的哈希码实现,所以我认为这可能就是 .equals 调用在这里失败的原因.虽然它说 "may have",但我很想知道这是否仍然适用于基本用例,并且对于某些特定的边缘情况更需要注意,或者这是否就是原因。
(我也许还应该指出我使用的是 eclipse 源代码生成器提供的默认 equals/hashcode 实现)
This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.
您引用的问题还不存在。该警告是为 value bases classes 做准备,可能会出现在 Java 10 或更高版本中。
不清楚你的问题是什么,但它肯定不那么奇特。这些是常见的陷阱(部分摘自评论):
- 混淆
int
和long
- 比较
Throwable
和Optional<Throwable>
:它们绝不能相等 - 比较两个
Throwable
s:因为他们通常不实现equals
,这很没有意义
我建议创建一个简单的 class,其中包含 Throwable
中的相关字段,然后改用它。