Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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代码编译成功_Java_Compilation_Equals_Hashcode - Fatal编程技术网

为什么这段Java代码编译成功

为什么这段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

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

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的大部分内容