我必须使用以下equals方法:
public boolean equals(ParentClass pa) {
if (!(pa instanceof ChildClass))
return false;
boolean sameID = ID.equals(pa.getID());
return super.equals(pa) && sameID;
}
ChildClass类是ParentClass类的子级,这就是equals方法。方法getId()仅在ChildClass中,但是我需要知道如何使方法pa.getID()起作用,是否可以在此处进行强制转换?由于出现错误,编译器无法确定pa是否为Child的实例。
这是我得到的错误:
Error:(19, 73) java: cannot find symbol
symbol: method getID()
location: variable pa of type ParentClass
我需要方法的类型为ParentClass,因为当对象的类型为ParentClass而不是错误时,该函数应返回false。
任何帮助将不胜感激。
答案 0 :(得分:-1)
在检查对象的类型并确保它是ChildClass
的实例之后,只需将其转换为ChildClass
类型并使用它即可:
public boolean equals(ParentClass pa) {
if (!(pa instanceof ChildClass))
return false;
ChildClass child = (ChildClass) pa;
boolean sameID = ID.equals(child.getID());
return super.equals(child) && sameID;
}
答案 1 :(得分:-2)
在覆盖equals
时,有一个通用的模式非常有用。我将在此处提供带有更正的版本,并概述以下这些更正:
@Override
public boolean equals(Object o) {
if (this == o) { return true; }
if (!super.equals(o)
|| o == null
|| getClass() != o.getClass()) {
return false;
}
ChildClass other = (ChildClass) o;
return this.getID().equals(other.getID());
}
首先,通常可以在equals
的实现之间复制粘贴的内容:
始终使用@Override
equals
方法-这将有助于确定意外使它重载的问题(相同的方法名称,不同的参数类型)。重载equals
是一种不良做法,会导致问题。
从==
开始检查-如果通过,则无需浪费CPU周期做更多的逻辑。尽管这实际上只是次要的优化,但这是一个有用的最佳实践。
如果要扩展Object
以外的其他类,请检查super
是否相等。
检查以确保类为相同。请注意,这不是不是 instanceof
支票。
equals
必须是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。instanceof
,很可能会遇到parent.equals(child) == true
但child.equals(parent) == false
的情况-这很糟糕。instanceof
可以,但是在大多数情况下检查类的相等性更加安全和正确。现在,该类特定的东西:
Object
参数设置为您的类类型,然后比较您关心的参数是否相等。
this
上的调用应与other
上的调用匹配-在您的情况下,我将两者都更改为调用getID()
方法。另外,两者都可以引用私有成员ID
-但它们应该保持一致。 最后,不要忘记equals
和hashCode
是一对-您应该始终一起实现它们。 (我知道您没有特别询问,但我指出是因为这是人们在实施equals
时常犯的错误)
我希望这对您和其他在实施equals
时遇到问题的人有所帮助。