从Parent类型的实例调用child的方法

时间:2018-12-03 21:55:14

标签: java object

我必须使用以下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。

任何帮助将不胜感激。

2 个答案:

答案 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) == truechild.equals(parent) == false的情况-这很糟糕。
    • 在某些情况下,instanceof可以,但是在大多数情况下检查类的相等性更加安全和正确。

现在,该类特定的东西:

  • Object参数设置为您的类类型,然后比较您关心的参数是否相等。
    • 请注意,this上的调用应与other上的调用匹配-在您的情况下,我将两者都更改为调用getID()方法。另外,两者都可以引用私有成员ID-但它们应该保持一致。

最后,不要忘记equalshashCode是一对-您应该始终一起实现它们。 (我知道您没有特别询问,但我指出是因为这是人们在实施equals时常犯的错误)

  • 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。如果您仅覆盖equals()而不是hashCode(),则您的类将违反此合同。

我希望这对您和其他在实施equals时遇到问题的人有所帮助。