gpt4 book ai didi

java - 为什么这个 Java 代码编译成功

转载 作者:行者123 更新时间:2023-11-29 08:39:43 24 4
gpt4 key购买 nike

我没有重写很多 hashCode()equals() 方法,所以我可能是错的我的问题是最后一行

dep1.equals(emp2) 正在编译成功(为什么)(我期待编译错误,因为它们有不同的类型)并且编译后我得到以下信息

15   15    false

我期望 15 15 true 因为我正在检查 equals 方法中的哈希码。

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

最佳答案

首先,这个编译的原因:Java中的所有类都继承自java.lang.Object ,它定义了 equals(Object)方法,并提供默认实现。这是您在比较 EmployeeDepartment 时调用的方法,而不是您提供的重载之一。

您的 equals 代码编译得很好,因为编译器不知道您认为您正在覆盖 equals 而实际上您并没有。编译器认为你想创建一个新方法

public boolean equals(Department department)

Department 对象与其他 Department 对象进行比较。

如果您正在编写覆盖父类(super class)方法的代码,请向其添加 @Override 注释,如下所示:

@Override
public boolean equals(Department department)

现在编译器会正确地向您提示您的方法实际上并没有覆盖其基类中的方法,并在编译时提醒您注意该问题。

要修复您的代码,请更改 equals 的签名以采用 Object,添加 @Override,检查 null 并为正确的类型进行转换,然后进行实际比较:

@Override
public boolean equals(Department obj) {
if (obj == null || !(obj instanceof Department)) {
return false;
}
Department dept = (Department)obj
return dept.id == id;
}

注意:像这样实现equals

return this.hashCode() == department.hashCode();

非常脆弱。尽管它适用于您的情况,但当哈希码是对象的唯一 ID 时,当 hashCode 被替换为其他一些实现时,这将无法在代码重构中幸存下来,例如,同时考虑两者的实现idname。如果要依赖比较ID,直接比较ID,不用调用hashCode获取。

关于java - 为什么这个 Java 代码编译成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com