继承类中的等号和哈希码

时间:2010-07-28 18:20:50

标签: java jpa

在我的理解中,下面的equal和hashcode实现是安全的,因为派生类中的正确方法会调用(而不是parent),即使我通过父指针调用它。如果父类被视为抽象类(在JPA中使用 - hiberante基类)。请根据以下示例确认此假设。

@Entity
@Inheritance
class A {
String type;
}

@Entity
class B extends A {
String uniqueName;
.......

@Override
    public boolean equals(Object obj) {
..
}
@Override
    public int hashCode() {
}
}

@Entity
class C extends A {
String uniqueName;
.......
@Override
    public boolean equals(Object obj) {
..
}
@Override
    public int hashCode() {
}
}

class D {
A a;
String name;
}

由于A可以接受B和C的实例,因此在为D编写等/哈希方法时,上述实现是否正常(仅在B& C中,而不是在A中)。不会出现A直接实例化的情况(新A)。

感谢。

3 个答案:

答案 0 :(得分:2)

您是否可以在派生类中编写hashcode和equals方法,而直接超类没有实现它们?

如果你说A类永远不会被直接实例化,为什么不宣布一个摘要,那么就没有问题。

答案 1 :(得分:1)

  

在我的理解中,下面   实现等号和哈希码   安全是正确的方法   派生类将调用(而不是   父母),即使我通过它来称呼它   父指针。

你要求多态吗?如果您这样做:是,调用哪个方法取决于运行时类型,而不是引用的类型。只要您的对象是B或C类型,一切都很好。

答案 2 :(得分:0)

我认为您的示例代码不完整,因为我怀疑您是否要求d.equals()方法使用a.equals(),然后调用哪个版本的equals()方法?

如果这就是你问的问题,那么答案就是equals()类型的a方法。如果aB,则B.equals()将被调用。如果aC,则会调用C.equals()。无论A是否有自己的equals()方法实现,都是如此。

既然你提到过Hibernate,我想你正在尝试创建一个join-subclass映射或者其他类似的东西。如果你正确地映射它,那么Hibernate将不会尝试直接实例化A,无论如何它应该是抽象的,因为这就是你描述它的方式。