をコンパイルされたのはなぜのhashCode()とのequals()メソッドので、私は間違っている可能性の多くをオーバーライドしていない このJavaコードが正常に
dep1.equals(emp2)
がされている場所私の質問は、最後の行のためにあります正常にコンパイル(なぜ)(彼らはさまざまな種類を持っているように、私はコンパイルエラーを期待してい)と私はCHECKIいますので、コンパイルした後、私は私が15 15真を期待してい
15 15 false
を以下の取得equalsメソッドでハッシュコードを作成します。
クラスEmployee
と
Department
の両方がまだ
Object
クラスから継承されたメソッド
public boolean equals(Object obj)
をオーバーライドしていないためだ
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));
}
}
によって
を置き換える15 15真であるとウル答えが必要な場合は、 '私は')(かなりのhashCode()とequalsのオーバーライドされていません、正確には、実際にオーバーロードしたときに 'Object#equals'をオーバーライドしませんでした。これをオーバーライドするには、メソッドが 'public boolean equals(Object)'のように見える必要があります。 – SomeJavaGuy
'equals(Object obj)'をオーバーライドしなかった場合、パラメータはメソッドのシグニチャの一部です。 '@ Override'アノテーションを追加することも考えてください。これはこのタイプの間違いを避けるでしょう。 – Berger
したがって、呼び出されるメソッドが 'equals(Object o)'なので、コンパイラエラーは発生しませんでした。コンパイラには合法ですが、実装が別のDepartmentオブジェクトを必要とするため、実行時例外が発生します。 – arcy