Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可选与Map equals实现不兼容吗?_Java_Guava_Equals_Optional - Fatal编程技术网

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()
。就是这样-谢谢!如果你把这个作为答案,我会把它标记为接受。