No, sólo se puede crear una clase abstracta en lugar de una interfaz de esta manera:
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);
}
o una versión más sencilla:
public abstract class MyApi {
public boolean equals(Object other) {
throw new UnsupportedOperationException("equals() not overridden: " + getClass());
}
}
EDITAR (que probarlo después de la comentario de @CodeConfident, gracias! Nunca asumí que funcionaría):
También puede simplemente declarar equals()
en un ab clase stract (! no en una interfaz) y, por tanto ocultar la aplicación Object
y hacer cumplir una nueva aplicación en cualquier subclase:
public abstract class MyApi {
public abstract boolean equals(Object obj);
public abstract int hashCode();
}
De todos modos siempre se debe aplicar equals()
y hashCode()
juntos para cumplir el contrato.
¿Cuál es su razón de ser para esto? –
El caso específico que encontré cuando surgió esta pregunta; Tengo una interfaz que implementó varias clases. Estas clases están identificadas por un identificador único. Entonces, si dos identificadores son iguales, los objetos deben considerarse iguales. En un momento tuve una lista de una de esas clases y quería saber si un objeto nuevo ya existía en la lista. Pensé que sería elegante usar List.contains (..) para este control. Pero eso requeriría que pudiera estar seguro de que los iguales fueron anulados. Sin embargo, es fácil de resolver de otras maneras. Una clase abstracta también habría funcionado bien. – Fredrik