为什么TransformedCollection没有实现hashCode?

4

我希望两个相同的转换后的对象具有相同的hashCode。我想使用这个属性来检查我的对象是否以有意义的方式发生了改变。

不幸的是,Guava的TransformedCollection extends AbstractCollection没有像AbstractList一样实现hashCode或equals方法,而TransformedCollection本身也没有尝试实现这些方法。

  • 我们能否基于迭代器返回的值的顺序计算一个hashCode
  • 或者,这仍然不能保证相同的hashCode吗?
  • 也许我们可以找到解决TransformedCollection问题的方法,而这种方法对于AbstractCollection是行不通的?
1个回答

11

很遗憾,目前还没有一个合理的方式来定义Collection.hashCode。一个集合可以是一个Set或一个List(或其他类型),而这两种情况下对hashCode的定义是不兼容的。

此外,出于同样的原因,transformedCollection1.equals(transformedCollection2)也没有一个合理的定义。它可能会忽略元素的顺序,也可能不会(像SetList>)。更糟糕的是,返回的Collection只是一个视图,这样的equals比较效率非常低。

我建议使用ImmutableList.copyOf(transformedCollection)来处理它。


3
如果你拥有一个列表,可以使用Lists.transform来进行转换。 - Kevin Bourrillion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接