Java 继承类中的Equal和hashcode
根据我的理解,下面的equal和hashcode实现是安全的,因为派生类中的正确方法将调用(而不是父类),即使我通过父指针调用它。前提是父类被视为抽象类(在JPA-Hibernate基类中使用)。请根据以下示例确认此假设Java 继承类中的Equal和hashcode,java,jpa,Java,Jpa,根据我的理解,下面的equal和hashcode实现是安全的,因为派生类中的正确方法将调用(而不是父类),即使我通过父指针调用它。前提是父类被视为抽象类(在JPA-Hibernate基类中使用)。请根据以下示例确认此假设 @Entity @Inheritance class A { String type; } @Entity class B extends A { String uniqueName; ....... @Override public boolean equals(
@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编写equal/hash方法时,上面的实现是否可以(仅在B&C中,而不是在A中)。不会有直接实例化a(新a)的情况
谢谢。您是否在即时超类未实现的派生类中编写hashcode和equals方法
如果你说类A永远不会被直接实例化,为什么不声明一个抽象,那么就没有问题了。我认为你的示例代码不完整,因为我怀疑你在问如果
d.equals()
方法使用A.equals()
,那么调用equals()
方法的哪个版本
如果这就是你要问的,那么答案将是a
类型的equals()
方法。如果a
是aB
,则将调用B.equals()
。如果a
是C
,则调用C.equals()
。无论A
是否有自己的equals()
方法实现,这都是正确的
既然您提到了Hibernate,我想您正在尝试创建一个连接的子类映射或类似的映射。如果映射正确,那么Hibernate不会尝试直接实例化A
,这实际上应该是抽象的,因为您就是这样描述它的
根据我的理解,以下是
equal和hashcode的实现
是安全的,因为在
派生类将调用(而不是
家长),即使我通过
父指针
你是在要求多态性吗?如果执行:是,调用哪个方法取决于运行时类型,而不是引用的类型。只要对象是B或C类型,一切都很好。哪种实现?您只是发布了声明,而不是方法体。使用IDE生成的代码。Tom,谢谢。。是的,这是我的问题。。不是关于实施。。。我不确定JPA是如何处理抽象类的。。快速搜索还显示了一些指定鉴别器列的示例。。我会读更多..@bsreekanth,当你没有特别重写A中的equals时,equals()和hashCode()是从Object继承的。谢谢。。对不起,我的问题不清楚,但你猜对了:-)