让我们假设我有一个简单的(java)类,它只包含3个接口对象。这三个对象一起构成了地图的关键值。现在我的问题是:如何为该类定义equals和hashcode?我的意思是,该类的所有成员都只是没有实现任何内容的接口?
示例:
class SomeKey {
public SomeKey(SomeWeiredInterface1 a, SomeWeiredInterface2 b, SomeWeiredInterface3 c){
....
}
}
最直接的方式是:
public boolean equals(Object other){
SomeKey otherKey = (SomeKey)other;
return a.equals.otherKey.a && b.equals.otherKey.b && c.equals.otherKey.c;
}
对我而言,它看起来根本不可能,或者至少我必须自己编写这些方法,因为我不能使用(或委托)任何哈希码或等于实现这些接口的方法?
感谢任何提示! 的Thorsten
答案 0 :(得分:2)
所有接口都隐式声明Object
类中的所有公共方法(请参阅JLS § 9.2)。您可以调用接口类型的equals
和hashCode
方法,它将在任何具体的类实现接口时调用重写的方法,或者它将调用从{{继承的那些方法的默认实现。 1}}。
您可以用同样的方式编写Object
的{{1}}和equals
方法,而不考虑字段类型是类还是接口:
hashCode
答案 1 :(得分:1)
这些是我的IDE自动生成的equals()和hashCode()方法:
public class SimpleClass {
private SimpleFirstInterface firstField;
private SimpleSecondInterface secondField;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SimpleClass that = (SimpleClass) o;
if (firstField != null ? !firstField.equals(that.firstField) : that.firstField != null) return false;
return secondField != null ? secondField.equals(that.secondField) : that.secondField == null;
}
@Override
public int hashCode() {
int result = firstField != null ? firstField.hashCode() : 0;
result = 31 * result + (secondField != null ? secondField.hashCode() : 0);
return result;
}
}
这两个方法在其中使用了接口实现的equals()和hashCode()方法,如果它们在那里提供的话。如果没有,那么将使用Object的equals()和hashCode()的标准实现。
答案 2 :(得分:0)
您可以使用(委托)实现类的等号和哈希码方法但是是的,您可以&#t; t < / strong>依赖他们。
实现类可能包含hashcode&amp; equals不会为同一个对象产生唯一的结果或同一个对象的不同哈希码。
我相信这3个接口是不是标记接口,并且有一些方法可以返回实现类的成员变量的状态。 如果以上情况属实,那么您可以在自己的hashcode()&amp;中使用状态。等于实施。
参见示例:
Interface A{
getValue();
}
Interface B{
getData();
}
class AImpl implements A{
private String value;
public String getValue(){
return value;
}
}
class BImpl implements B{
private int data;
public int getData{
return data;
}
}
class SomeKey{
private A value;
private B data;
//constructor
public SomeKey(A value, B data){
this.value = value;
this.data = data;
}
@Override
public int hashcode(){
int result = 1;
result = 29 * result + value.hashcode();
result = result + data.hashcode();
return result;
}
//similarly override equals
}
答案 3 :(得分:-1)
或许类似于使用Comparable Interface覆盖方法hashcode(),equals()和compareTo()。尝试使用其他接口。 我没有看到上面的答案,当然还有很好的例子。
private static class SomeString implements Comparable<SomeString> {
private final String s;
SomeString(final String s) {
this.s = s;
}
@Override
public int compareTo(final SomeString o) {
return s.compareTo(o.s);
}
}
@Override
public boolean equals(final Object o) {
if(o == null) return false;
if(this == o) return true;
if(this.getClass() != o.getClass()) return false;
final SomeString o1 = (SomeString) o;
return compareTo(o1) == 0;
}
@Override
public int hashCode() {
return s.hashCode();
}
private static class SomeString implements Comparable<SomeString> {
private final String s;
SomeString(final String s) {
this.s = s;
}
@Override
public int compareTo(final SomeString o) {
return s.compareTo(o.s);
}