【发布时间】:2012-08-17 16:06:05
【问题描述】:
是否可以要求实现一个接口来覆盖Object 方法?
例如,如果我有一个通常用作HashMaps 中的键的接口,我可能希望要求该接口的所有实现都覆盖hashCode() 和equals() 方法。
但是,如果我有以下界面...:
public interface MyInterface(){
@Override
public int hashCode();
@Override
public boolean equals(Object o);
}
...以下实现编译:
public class MyImplementation(){
}
它不需要重写hashCode() 或equals() 的方法,因为它从Object 继承了这些方法。
一种方法是改用抽象类而不是接口:
public abstract class MyAbstractClass(){
@Override
public abstract int hashCode();
@Override
public abstract boolean equals(Object o);
}
那么任何扩展这个抽象类的类都需要覆盖hashCode()和equals():
// doesn't compile - requires implementation of hashCode() and equals()
public class MyClass extends MyAbstractClass {
}
// does compile
public class MyClass extends MyAbstractClass {
@Override
public int hashCode(){
// calculate hashcode
}
@Override
public boolean equals(Object o){
// check equality
}
}
我的猜测是,这两者的区别在于抽象类是Object,所以它在层次结构中低于Object,所以所有扩展都需要满足抽象类中的约定。而接口不是Objects,所以不要坐在层次结构中,但是接口的任何实现都必须是Object,此时它继承了Object方法,因此满足接口'契约'。
但是,回到我最初的问题...有没有办法要求接口的实现覆盖Object 方法?
【问题讨论】:
-
不,第一个子类满足合同。如果实现类的前一个类实现了所有接口的方法,则“契约”已经满足。
标签: java interface abstract-class