繁体   English   中英

如何在Java中的equals覆盖方法中强制转换对象?

[英]How can I cast an Object in an equals override method in Java?

我在一个类中有以下代码,该类用于根据文件提交人用雇主提交的文件模拟IRS。 我需要重写equals类,但是我不断收到错误消息,说在强制转换的对象上调用时找不到我要使用的方法。

    @Override
public boolean equals(Object obj) {
    if ((this == null )|| (obj == null) || (this.getClass() != obj.getClass()))
        return false;
    if ((this.sameEmployer((Employer)obj))
    && (this.getEmployeeSSN() == (Employer)obj.getEmployeeSSN())
    && (this.getName() == (Employer)obj.getName())
    && (this.getEmployeeName() == (Employer)obj.getEmployeeName())
    && (this.getEmployeeWages() == (Employer)obj.getEmployeeWages()))
        return true;
    else
        return false;
}

在方法调用之后进行转换。 根据运算符的优先级()用于方法调用的级别最高,为1,而用于(cast ()的转换级别为3。换句话说,您正尝试将obj.getEmployeeSSN()Employer ,而不是obj

一旦知道objEmployer ,就可以放置括号以强制强制转换,例如

&& (this.getEmployeeSSN() == ((Employer) obj).getEmployeeSSN())

但是,它看起来像是一团糟。 为了清楚起见,只需声明一个Employer变量,将其强制转换一次,然后调用方法,并传递Employer变量。

Employer emp = (Employer) obj;
if (this.sameEmployer(emp)
    && ...

对于这样的表达式:

(Employer)obj.getEmployeeSSN()

. 具有比“强制转换”更高的优先级(“绑定更紧密”)。 因此,它更接近:

(Employer) (obj.getEmployeeSSN())

...而您想要:

((Employer) obj).getEmployeeSSN()

为了进行转换然后调用该方法。 通过在较早的行中进行投射,最容易做到这一点:

public boolean equals(Object obj) {
    if (obj == null || this.getClass() != obj.getClass()) {
        return false;
    }
    Employee other = (Employee) obj;
    // Now use "other" in the rest of the code:
    return sameEmployer(other)
        && getEmployeeSSN() == other.getEmployeeSSN()
        ...;
}

注意:

  • this永远不能为空,因此您不需要测试
  • 您不需要像以前一样多的括号
  • 我强烈建议您在所有if块中都使用大括号...您会惊讶地发现,否则容易出错。 (有很多SO问题,基本上是由于这个原因...)
  • 您有任何时间:

     if (foo) { return true; } else { return false; } 

    您应该将其简化为:

     return foo; 

Object没有getEmployeeSSN() 您应该拥有的是:

(this.getEmployeeSSN() == ((Employer)obj).getEmployeeSSN() //and so forth.

强制转换应该首先发生,然后尝试在强制转换的对象上使用方法

您只是对操作的优先级有疑问。 调用特定方法后,将强制转换为(Employer)。 要强制执行优先级,您需要添加方括号:

((Employer) obj).getName()

代替

(Employer) obj.getName()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM