假设有两类这样的:当superclass不重新声明equals()和hashCode()时会出现什么问题?
abstract class A { /* some irrelevant methods */ }
class B extends A {
public final int x;
public B(final int x) {
this.x = x;
}
/* some more irrelevant methods */
}
然后我产生对B
类equals()
和hashCode()
方法使用Eclipse的 “源→生成的hashCode()和equals()......”。但Eclipse警告我:
超类'com.example.test2.A'不重新声明equals()和hashCode() - 生成的代码可能无法正常工作。
那么,什么会导致生成的代码与生成的方法无法正常工作?
(顺便说一句,生成的方法是这样的:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
B other = (B) obj;
if (x != other.x)
return false;
return true;
}
)
这可能是有趣的。这就是说,我不确定它是如何适用的,因为A是抽象的。 http://www.artima.com/lejava/articles/equality.html。大多数情况下,它试图阻止这个'b.equals(a)',但'!a.equals(b)' – SJuan76 2013-04-26 12:47:33
我认为你的问题已经受到了大量文献的影响,这些文献解释了一个非常相似但却截然不同的情景。下面的几乎每个答案都会谈到超类有一个“等号”方法,而在你的例子中,它显然不是。我甚至不是提问者,我在这里感到沮丧! – 2013-04-26 18:48:17
@KennyTM是否仍然生成警告,如果您删除抽象修饰符? – Mike 2013-04-26 19:10:29