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 或更高版本中。


不清楚你的问题是什么,但它肯定不那么奇特。这些是常见的陷阱(部分摘自评论):

  • 混淆 intlong
  • 比较 ThrowableOptional<Throwable>:它们绝不能相等
  • 比较两个 Throwables:因为他们通常不实现 equals,这很没有意义

我建议创建一个简单的 class,其中包含 Throwable 中的相关字段,然后改用它。