如何在Java中使用equals override方法转换Object?

时间:2014-10-01 20:50:46

标签: java methods casting

我在一个类中有以下代码,用于根据文件管理器模拟IRS和雇主备案。我需要覆盖equals类,但我一直得到错误,说在调用casted对象时无法找到我尝试使用的方法。

    @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;
}

4 个答案:

答案 0 :(得分:3)

在方法调用之后进行强制转换。方法调用的According to the precedence of operators()位于最高级别1,而用于投射的()位于级别3.换句话说,您正在尝试将obj.getEmployeeSSN()转换为Employer,而非obj

一旦你知道objEmployer,就可以放置括号以强制推送,例如

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

然而,它看起来像是一堆乱七八糟的括号。为清楚起见,只需声明一个Employer变量,抛出一次,然后调用方法,传递Employer变量。

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

答案 1 :(得分:2)

对于这样的表达式:

(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;
    

答案 2 :(得分:1)

班级Object没有getEmployeeSSN()。你应该拥有的是:

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

首先应该进行转换,然后尝试在转换对象上使用该方法

答案 3 :(得分:0)

您的操作优先级有问题。在调用特定方法后,将转换为(雇主)。要强制执行优先级,您需要添加括号:

((Employer) obj).getName()

而不是

(Employer) obj.getName()