我有一个抽象的实体类,有3个略有不同的实体。在我的3个子类中,我已经覆盖了equals并且有方法,但问题是,我是否也应该在抽象实体中执行此操作?如果我不这样做,我将无法比较仅由抽象实体定义的实体,除非我投射它们。如果我做一个等于将我冒险与不同的子实体进行比较,并得到它们是相似的?
示例:
abstract class Log{}
SystemLog extends Log{}
UserLog extends Log{}
public void test(Log log){
Log myInner = new SystemLog();
if(log.equals(myInner)){
//do random stuff
}
}
答案 0 :(得分:1)
我看不到投射的问题。 equals的参数类型是Object,因此无论如何都必须进行转换才能访问属性。
如果在每个子类中定义equals方法,那么何时会调用抽象超类中的equals?
如果我做了等于,我将面临与不同子实体进行比较的风险 得到他们是相似的
无论如何,您都有可能将不同的子实体进行比较。想象一下将超类设置为填充了两个不同子类的两个实例的对象的类型。它与你在超类中重写equals没有太大关系。
在您的示例中,可能在抽象类中实现的equals方法如果我们已经在实际的子类中实现了,则不会调用Log:
假设:
UserLog extends Log{
public boolean equals(Object o) {
//I do override equals method so I am one who is called.
//and here you go and check type with something like
if (this == o) return true;
if (!(o instanceof UserLog)) return false;//accepts subclasses of UserLog
....
}
...
}
//And then somewhere else
Log ul = new UserLog();
test(ul);