为什么这段Java代码编译成功
我没有重写很多hashCode()和equals()方法,所以我可能是错的 我的问题是最后一行在哪里为什么这段Java代码编译成功,java,compilation,equals,hashcode,Java,Compilation,Equals,Hashcode,我没有重写很多hashCode()和equals()方法,所以我可能是错的 我的问题是最后一行在哪里 dep1.equals(emp2)正在成功编译(为什么)(我期待编译错误,因为它们有不同的类型),编译后我得到以下结果 15 15 false 其中我期望15 15 true,因为我正在检查equals方法中的hashcode class Employee { private String name; private int id; public Emplo
dep1.equals(emp2)
正在成功编译(为什么)(我期待编译错误,因为它们有不同的类型),编译后我得到以下结果
15 15 false
其中我期望15 15 true,因为我正在检查equals方法中的hashcode
class Employee {
private String name;
private int id;
public Employee(String name, int id) {
this.name = name;
this.id = id;
}
public int hashCode() {
return this.id;
}
public boolean equals(Employee employee) {
return this.hashCode() == employee.hashCode();
}
public int getEmployeeId() {
return this.id;
}
}
class Department {
private String name;
private int id;
public Department(String name, int id) {
this.name = name;
this.id = id;
}
public int hashCode() {
return this.id;
}
public boolean equals(Department department) {
return this.hashCode() == department.hashCode();
}
public int getDepartmentId() {
return this.id;
}
}
public class JavaCollections {
public static void main(String args[]) {
Employee emp2 = new Employee("Second Employee", 15);
Department dep1 = new Department("Department One", 15);
System.out.println(dep1.hashCode()+" "+emp2.hashCode()+" " + dep1.equals(emp2));
}
}
这是因为
Employee
和Department
两个类仍然没有重写从Object
类继承的方法public boolean equals(Object obj)
确切地说,这个方法是在dep1.equals(emp2)
中调用的,而不是public boolean equals(Department)
更具体地说,请阅读:
在类C中声明或由类C继承的实例方法mC重写了在类A中声明的另一个方法mA,如果以下所有条件均为真:
...
mC的签名是mA签名的子签名(§8.4.2)。
在这种情况下,
boolean equals(Department-Department)
不是boolean equals(Object-obj)
的子签名,这是因为Employee
和Department
两个类仍然没有重写方法公共布尔equals(Object-obj)
继承自对象
类
确切地说,这个方法是在dep1.equals(emp2)
中调用的,而不是public boolean equals(Department)
更具体地说,请阅读:
在类C中声明或由类C继承的实例方法mC重写了在类A中声明的另一个方法mA,如果以下所有条件均为真:
...
mC的签名是mA签名的子签名(§8.4.2)。
在本例中,
boolean equals(Department)
不是boolean equals(Object obj)
的子签名,首先,这是编译的原因:Java中的所有类都继承自,它定义了方法,并提供了默认实现。这是比较员工
和部门
时调用的方法,而不是您提供的任何重载
您的equals
代码编译得很好,因为编译器不知道您认为您正在重写equals
,而实际上您并不知道。编译器认为您需要创建一个新方法
public boolean equals(Department department)
将部门
对象与其他部门
对象进行比较
如果要编写重写超类方法的代码,请向其添加@Override
注释,如下所示:
@Override
public boolean equals(Department department)
现在,编译器将正确地向您抱怨您的方法实际上没有重写其基类中的方法,从而在编译时提醒您这个问题
要修复代码,请更改equals
的签名以获取对象
,添加@Override
,检查是否为空
,并执行转换,然后执行实际比较:
@Override
public boolean equals(Department obj) {
if (obj == null || !(obj instanceof Department)) {
return false;
}
Department dept = (Department)obj
return dept.id == id;
}
注意:像这样实现等于
return this.hashCode() == department.hashCode();
它非常脆弱。尽管它在您的情况下是有效的,但当哈希代码是对象的唯一ID时,如果将hashCode
替换为其他实现(例如,同时考虑ID
和name
的实现),它将无法在代码重构后继续存在。如果您想依靠比较ID,请直接比较ID,而无需调用hashCode
来获取它们。首先,这是编译的原因:Java中的所有类都继承自,它定义了方法,并提供了默认实现。这是比较员工
和部门
时调用的方法,而不是您提供的任何重载
您的equals
代码编译得很好,因为编译器不知道您认为您正在重写equals
,而实际上您并不知道。编译器认为您需要创建一个新方法
public boolean equals(Department department)
将部门
对象与其他部门
对象进行比较
如果要编写重写超类方法的代码,请向其添加@Override
注释,如下所示:
@Override
public boolean equals(Department department)
现在,编译器将正确地向您抱怨您的方法实际上没有重写其基类中的方法,从而在编译时提醒您这个问题
要修复代码,请更改equals
的签名以获取对象
,添加@Override
,检查是否为空
,并执行转换,然后执行实际比较:
@Override
public boolean equals(Department obj) {
if (obj == null || !(obj instanceof Department)) {
return false;
}
Department dept = (Department)obj
return dept.id == id;
}
注意:像这样实现等于
return this.hashCode() == department.hashCode();
它非常脆弱。尽管它在您的情况下是有效的,但当哈希代码是对象的唯一ID时,如果将hashCode
替换为其他实现(例如,同时考虑ID
和name
的实现),它将无法在代码重构后继续存在。如果您想依靠比较ID,请直接比较ID,而无需调用hashCode
来获取它们。首先,此代码dep1.equals(emp2)调用对象类的默认实现
第二,您没有重写两个类中的默认实现,因为您不能重写特定自定义类型的equal方法
如果你需要你的答案是正确的
替换
public boolean equals(Department department) {
return this.hashCode() == department.hashCode();
}
借
首先,此代码dep1.equals(emp2)调用对象类的默认实现
第二,您没有重写两个类中的默认实现,因为您不能重写特定自定义类型的equal方法
如果你需要你的答案是正确的
替换
public boolean equals(Department department) {
return this.hashCode() == department.hashCode();
}
借
我还没有覆盖hashCode()和eq的大部分内容