在我的理解中,下面的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)。
感谢。
答案 0 :(得分:2)
您是否可以在派生类中编写hashcode和equals方法,而直接超类没有实现它们?
如果你说A类永远不会被直接实例化,为什么不宣布一个摘要,那么就没有问题。
答案 1 :(得分:1)
在我的理解中,下面 实现等号和哈希码 安全是正确的方法 派生类将调用(而不是 父母),即使我通过它来称呼它 父指针。
你要求多态吗?如果您这样做:是,调用哪个方法取决于运行时类型,而不是引用的类型。只要您的对象是B或C类型,一切都很好。
答案 2 :(得分:0)
我认为您的示例代码不完整,因为我怀疑您是否要求d.equals()
方法使用a.equals()
,然后调用哪个版本的equals()
方法?
如果这就是你问的问题,那么答案就是equals()
类型的a
方法。如果a
是B
,则B.equals()
将被调用。如果a
是C
,则会调用C.equals()
。无论A
是否有自己的equals()
方法实现,都是如此。
既然你提到过Hibernate,我想你正在尝试创建一个join-subclass映射或者其他类似的东西。如果你正确地映射它,那么Hibernate将不会尝试直接实例化A
,无论如何它应该是抽象的,因为这就是你描述它的方式。