[英]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
。
一旦知道obj
是Employer
,就可以放置括号以强制强制转换,例如
&& (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.