我在一个类中有以下代码,用于根据文件管理器模拟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;
}
答案 0 :(得分:3)
在方法调用之后进行强制转换。方法调用的According to the precedence of operators,()
位于最高级别1,而用于投射的()
位于级别3.换句话说,您正在尝试将obj.getEmployeeSSN()
转换为Employer
,而非obj
。
一旦你知道obj
是Employer
,就可以放置括号以强制推送,例如
&& (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()