Java可选与Map equals实现不兼容吗?
我有Java可选与Map equals实现不兼容吗?,java,guava,equals,optional,Java,Guava,Equals,Optional,我有Map的实例(使用其他表示法(如HashMap)中的ImmutableMap.of/copyOf进行实例化)。调试时,这些实例看起来完全相同,我正在尝试使用.equals在单元测试中进行比较。我想我可能已经找到了这个问题,但我想确认一下 这是一个基于价值的类;在Optional实例上使用标识敏感操作(包括引用相等(=)、标识哈希代码或同步)可能会产生不可预测的结果,应避免 从我所读到的内容来看,Map equality的实现在大多数情况下依赖于(至少?)value参数的hashcode实现
Map
的实例(使用其他表示法(如HashMap)中的ImmutableMap.of/copyOf进行实例化)。调试时,这些实例看起来完全相同,我正在尝试使用.equals在单元测试中进行比较。我想我可能已经找到了这个问题,但我想确认一下
这是一个基于价值的类;在Optional实例上使用标识敏感操作(包括引用相等(=)、标识哈希代码或同步)可能会产生不可预测的结果,应避免
从我所读到的内容来看,Map equality的实现在大多数情况下依赖于(至少?)value参数的hashcode实现,因此我认为这可能就是.equals调用在这里失败的原因。因为它说“可能有”,我很想知道这在基本用例中是否仍然有效,并且警告更适用于某些特定的边缘情况,或者这是否就是原因
(我还应该指出,我使用的是eclipse源代码生成器提供的默认equals/hashcode实现)
这是一个基于价值的类;在Optional实例上使用标识敏感操作(包括引用相等(=)、标识哈希代码或同步)可能会产生不可预测的结果,应避免
你提到的问题还不存在。警告是Java 10或更高版本中可能出现的一种准备
不清楚你的问题出在哪里,但肯定没有那么奇怪。这些是常见的陷阱(部分来自评论):
- 混淆
和int
long
- 比较可丢弃的和可选的:它们决不能相等
- 比较两个可丢弃的s:因为它们通常实现no
,这是毫无意义的equals
Throwable
的相关字段,并改用它
这是一个基于价值的类;在Optional实例上使用标识敏感操作(包括引用相等(=)、标识哈希代码或同步)可能会产生不可预测的结果,应避免
你提到的问题还不存在。警告是Java 10或更高版本中可能出现的一种准备
不清楚你的问题出在哪里,但肯定没有那么奇怪。这些是常见的陷阱(部分来自评论):
- 混淆
和int
long
- 比较可丢弃的和可选的:它们决不能相等
- 比较两个可丢弃的s:因为它们通常实现no
,这是毫无意义的equals
我建议创建一个简单的类,其中包含来自
Throwable
的相关字段,并使用它。调试时,long看起来像int,这可能是问题所在。如果没有,请发布一篇文章。您能否显示创建您正在比较的实例的特定代码?您的问题不是可选的,因为它的实现将转发给包装的对象。您的问题是,包装的可丢弃对象(通常)没有实现equals()
。就是这样-谢谢!如果你把它作为答案,我会把它标记为已接受。调试时,long看起来像int,这可能是问题所在。如果没有,请发布一篇文章。您能否显示创建您正在比较的实例的特定代码?您的问题不是可选的,因为它的实现将转发给包装的对象。您的问题是,包装的可丢弃对象(通常)没有实现equals()
。就是这样-谢谢!如果你把这个作为答案,我会把它标记为接受。