Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何在equals覆盖方法中强制转换对象?_Java_Methods_Casting - Fatal编程技术网

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

在Java中,如何在equals覆盖方法中强制转换对象?,java,methods,casting,Java,Methods,Casting,我在一个类中有以下代码,用于模拟IRS,并根据文件提交人提交雇主文件。我被要求重写equals类,但我不断收到错误消息,说在casted对象上调用时找不到我尝试使用的方法 @Override public boolean equals(Object obj) { if ((this == null )|| (obj == null) || (this.getClass() != obj.getClass())) return false; if ((thi

我在一个类中有以下代码,用于模拟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;
}

对象
没有
getEmployeeSSN()
。你应该做的是:

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

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

对象
没有
getEmployeeSSN()
。你应该做的是:

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

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

在方法调用之后进行强制转换<方法调用的代码>()处于最高级别1,而强制转换的代码>()处于级别3。换句话说,您正试图将
obj.getEmployeeSSN()
转换为
雇主
,而不是
obj

一旦你知道obj是一个雇主,你就可以先用括号来强制转换,例如

&& (this.getEmployeeSSN() == ((Employer) obj).getEmployeeSSN())
然而,它看起来像一堆括号。为清楚起见,只需声明一个
Employer
变量,将其强制转换一次,然后调用方法,传递
Employer
变量

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

转换在方法调用之后发生<方法调用的代码>()处于最高级别1,而强制转换的代码>()处于级别3。换句话说,您正试图将
obj.getEmployeeSSN()
转换为
雇主
,而不是
obj

一旦你知道obj是一个雇主,你就可以先用括号来强制转换,例如

&& (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()
        ...;
}
请注意:

  • 永远不能为空,因此您无需对其进行测试
  • 你不需要像以前那样多的括号
  • 我强烈建议您对所有
    if
    块使用大括号。。。你会惊讶地发现,如果不是这样的话,你会很容易犯错误。(有很多这样的问题,基本上都是因为…)
  • 任何时候您都可以:

    if (foo) {
        return true;
    } else {
        return false;
    }
    
    您应该将其简化为:

    return foo;
    

对于此类表达式:

(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()
        ...;
}
请注意:

  • 永远不能为空,因此您无需对其进行测试
  • 你不需要像以前那样多的括号
  • 我强烈建议您对所有
    if
    块使用大括号。。。你会惊讶地发现,如果不是这样的话,你会很容易犯错误。(有很多这样的问题,基本上都是因为…)
  • 任何时候您都可以:

    if (foo) {
        return true;
    } else {
        return false;
    }
    
    您应该将其简化为:

    return foo;
    

您只是在操作优先级方面遇到了问题。在您调用特定方法后,将发生对(雇主)的强制转换。要强制执行优先级,需要添加括号:

((Employer) obj).getName()
而不是

(Employer) obj.getName()

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

((Employer) obj).getName()
而不是

(Employer) obj.getName()

一个注意事项是“this==null”永远不会发生,因此您可以删除此
this.getName()==(雇主)obj.getName()
我猜
getName()
返回一个
字符串,对吗?然后改用
this.getName().equals(((雇主)obj).getName())
。注意“this==null”永远不会发生,所以你可以删除这个
this.getName()==(雇主)obj.getName()
我猜
getName()
返回一个
字符串,对吗?然后改用
this.getName().equals(((雇主)obj).getName())
。由于第一次签入,因此该对象必须是雇主类,如果是这样,它将可以访问我所认为的方法。所以这就是我需要修复的。@Ethan,对象是雇主类,但在使用雇主类方法之前,您需要使用
(雇主)obj
完成强制转换。对象必须是雇主类,因为在第一个签入中,如果是这样的话,它将访问我认为的方法。这就是我需要解决的问题。@Ethan,对象是雇主类,但在使用雇主类方法之前,需要使用
(雇主)obj
完成强制转换。