我肯定遗漏了一些关于Equivalence.wrap()
的东西,但是下面的测试对我来说失败了--只在最后一行使用番石榴18.0。为什么?我做错了什么?我的目标是通过将等效对象添加到集合中来去重复它们。
@Test
public void testEquivalenceWrap()
{
final Equivalence<Program2> eq = EquivalentIfIDsEven.INSTANCE;
Program2 p1 = new Program2();
p1.setId(2L);
Program2 p2 = new Program2();
p2.setId(4L);
//sanity-test equivalence impl
assertFalse(p1.equals(p2));
assertTrue(eq.equivalent(p1, p2));
assertTrue(eq.wrap(p1).equals(eq.wrap(p2)));
//dedupe in set
final Set<Equivalence.Wrapper<Program2>> set = new HashSet<>();
set.add(eq.wrap(p1));
set.add(eq.wrap(p2));
assertEquals(1, set.size()); //FAIL: size == 2
}
发布于 2014-12-03 18:44:37
如果您的Equivalence
没有正确实现哈希,您就会得到这种行为。如果没有看到更多的代码,我就无法提出更具体的建议,但这几乎肯定是正在发生的事情。
发布于 2014-12-03 19:02:18
如果我是您,我尝试在您的测试中使用这个类(例如,在等效类中使用javadoc中的EqualsEquivalence ):
static final class EquivalentIfIDsEven extends Equivalence<Program2>
implements Serializable {
static final EquivalentIfIDsEven INSTANCE = new EquivalentIfIDsEven();
@Override protected boolean doEquivalent(Program2 a, Program2 b) {
return a.equals(b);
}
@Override protected int doHash(Program2 o) {
return o.hashCode();
}
private Program2 readResolve() {
return INSTANCE;
}
private static final long serialVersionUID = 1;
}
https://stackoverflow.com/questions/27278750
复制相似问题