gpt4 book ai didi

java - 尽管 equals() 和 hashCode() 返回不同的值,Multimap 仍然在 containsValue() 上找到实例。怎么可能?

转载 作者:行者123 更新时间:2023-12-01 23:10:36 26 4
gpt4 key购买 nike

我构建了一个 TreeMultimap 并想要添加我的 Wedge 类的实例。但它拒绝添加超过一项。我有点茫然,因为我实现了 equals 和 hashCode。似乎更奇怪的是,当我调用调试器中的方法来检查是否没有犯错误时,不同对象上的这些方法返回不同的值。因此,包含检查返回 true 似乎很奇怪。这里有一些代码:

@NonNullByDefault
public class Wedge extends Corona
{
/** Field of the description to display for the wedge. */
private String description;

//Fields and other unrelated methods.

/**
* {@inheritDoc}<br><br>
* Method for determining if both coronas are equal.
* Returns true if both share the same description.
*/
@Override
public boolean equals(@Nullable Object object)
{
if(object == null) return false;
if(object == this) return true;

if(object instanceof Wedge)
{
return description.equals(((Wedge) object).description);
}
return false;
}

/**
* {@inheritDoc}<br><br>
* Method for determining the hash code based on the description.
*/
@Override
public int hashCode()
{
return description.hashCode();
}
}

代码使用或多或少,简化代码如下:

/** The visual components to display as part of the widget. It's background. */
public Multimap<Integer, Corona> coronas = TreeMultimap.create();

// More interesting fields and methods.
/**
* Method for adding a corona to a given handle.
* @param handleID
* The identifier of the handle for which to add the corona.
* @param corona
* The corona to display on the handle.
* @return
* An instance of the builder for chain calling.
*/
@SuppressWarnings("unchecked")
public B withCorona(int handleID, Corona corona)
{
coronas.put(handleID, corona);
return (B) this;
}

代码是构建器对象的一部分。请原谅泛型。 handleID 是我用来绑定(bind) corona 实例的 key 。它的行为符合预期。 corona 变量包含不同的 corona 实例,因为在循环中调用该方法来添加所有 Corona 实例。

现在,一旦我添加第一个 Wedge 测试,例如 coronas.containsValue(corona),即使我构建了一个新的 Wedge,也会返回 true > 实例并将其传递给方法。如前所述,使用 corona.equals(coronaInTheMap) 或 corona.hashCode() == hashCodeOfCoronaInMap 的测试返回不同的值。

描述在构造函数中设置并且从未修改!

我已经搜索了错误,但被踩了。我需要你的帮助!

最佳答案

TreeMultimap 使用 Comparable 而不是 equalshashCode。来自 JavaDoc:

Implementation of Multimap whose keys and values are ordered by their natural ordering or by supplied comparators. In all cases, this implementation uses Comparable.compareTo(T) or Comparator.compare(T, T) instead of Object.equals(java.lang.Object) to determine equivalence of instances.

关于java - 尽管 equals() 和 hashCode() 返回不同的值,Multimap 仍然在 containsValue() 上找到实例。怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22092237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com