在界面中强制"等于"

Fre*_*rik 9 java

我有一个接口,我希望实现此接口的每个人都实现一个覆盖的"等于"方法.

有没有办法确保发生这种情况?

我猜这种情况的方式是实现我的接口的类将自动从Object获取equals,从而使界面愉快.

Arn*_*ter 10

不,你只能创建一个抽象类而不是像这样的接口:

public abstract class MyApi {

  public final boolean equals(Object other) {
    if (other == this) {
      return true;
    }
    if (other instanceof MyApi) {
      return equals((MyApi)other);
    }
    return false;
  }

  protected abstract boolean equals(MyApi other);

}
Run Code Online (Sandbox Code Playgroud)

或更简单的版本:

public abstract class MyApi {

  public boolean equals(Object other) {
    throw new UnsupportedOperationException("equals() not overridden: " + getClass());
  }

}
Run Code Online (Sandbox Code Playgroud)

编辑(在@CodeConfident评论后试一试,谢谢!从未认为它会起作用):

您也可以简单地equals()在抽象类中声明(不在接口中!),因此隐藏Object实现并在任何子类中强制执行新实现:

public abstract class MyApi {

  public abstract boolean equals(Object obj);

  public abstract int hashCode();

}
Run Code Online (Sandbox Code Playgroud)

无论如何,你应该总是实施equals()hashCode()共同履行合同.

  • @ilmtitan:你不能声明一个继承的方法摘要! (2认同)