gpt4 book ai didi

java - ArrayList.containsAll 不使用我的自定义 equals 函数

转载 作者:搜寻专家 更新时间:2023-11-01 01:40:08 25 4
gpt4 key购买 nike

以下代码是 JUnit 测试函数,执行失败。

List<KGramPostingsEntry> a = new ArrayList<KGramPostingsEntry>();
List<KGramPostingsEntry> b = new ArrayList<KGramPostingsEntry>();
KGramPostingsEntry entry = new KGramPostingsEntry(1);
a.add(entry);

entry = new KGramPostingsEntry(1);
b.add(entry);

assertTrue(a.containsAll(b));

它使用 KGramPostingsEntry 类:

package ir;

public class KGramPostingsEntry {
int tokenID;

public KGramPostingsEntry(int tokenID) {
this.tokenID = tokenID;
}

public KGramPostingsEntry(KGramPostingsEntry other) {
this.tokenID = other.tokenID;
}

public String toString() {
return tokenID + "";
}
public boolean equals(KGramPostingsEntry other) {
if(other.tokenID == this.tokenID) {
return true;
}
return false;
}
}

如您所见,类中有一个equals() 函数,用于比较不同KGramPostingsEntry 对象的tokenID。在我看来,在测试中调用 containsAll() 时并没有使用这个函数。进一步的实验似乎证实了这一点:

List<KGramPostingsEntry> a = new ArrayList<KGramPostingsEntry>();
List<KGramPostingsEntry> b = new ArrayList<KGramPostingsEntry>();
KGramPostingsEntry entry = new KGramPostingsEntry(1);
a.add(entry);
b.add(entry);

assertTrue(a.containsAll(b));

在这里,我在两个列表中插入相同的对象。此测试不会失败。据我所知,在存储对该对象的引用之前,ArrayList 制作发送到 add() 的对象的副本对象。这意味着两个 List 中的对象不相同(即使它们具有相同的 tokenID),并且 containsAll()不检查对象引用是否相等。但是,如果它不检查对象引用是否相等并且不检查我的代码中定义的 equals() 函数,它会检查什么?对我来说唯一合理的选择是它检查对象 value 是否相等,并且存储在第一个测试示例中的两个对象不知何故不同(即使它们唯一的属性是tokenID,在两个对象中是相同的)。

这是怎么回事?我怎样才能让这个测试按照我想要的方式成功?

最佳答案

这里是 Objectequals 声明:

public boolean equals(Object obj)

(documentation)。您试图覆盖此方法,但您重载它:

public boolean equals(KGramPostingsEntry other)

注意你的方法中的参数类型是KGramPostingsEntry,它不同于Object.equals中的参数类型,即Object。当一个方法具有相同的名称但不同的参数类型时,它被重载,而不是被覆盖。

ArrayList 尝试将其内容与 equals 进行比较时,它将使用最适用的 Object.equals 覆盖版本。不幸的是,这不包括您的方法。

幸运的是,修复很简单:您需要使用 Object 参数实现您的 equals 方法:

public boolean equals(Object obj) {
if(obj == null || !(obj instanceof KGramPostingsEntry)) {
return false;
}
KGramPostingsEntry other = (KGramPostingsEntry) obj;
if(other.tokenID == this.tokenID) {
return true;
}
return false;
}

关于java - ArrayList.containsAll 不使用我的自定义 equals 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49943849/

25 4 0