No, è solo possibile creare una classe astratta invece di un'interfaccia come questa:
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 versione più semplice:
public abstract class MyApi {
public boolean equals(Object other) {
throw new UnsupportedOperationException("equals() not overridden: " + getClass());
}
}
EDIT (dato una prova dopo il commento da @CodeConfident, grazie! Mai supposto che avrebbe funzionato):
Si può anche semplicemente dichiarare equals()
in un Classe stract (! non in un'interfaccia) e quindi nascondere l'attuazione Object
e applicare una nuova implementazione in ogni sottoclasse:
public abstract class MyApi {
public abstract boolean equals(Object obj);
public abstract int hashCode();
}
In ogni caso si dovrebbe sempre implementare equals()
e hashCode()
insieme per adempiere al contratto.
fonte
2010-06-10 06:26:07
Qual è il tuo fondamento logico per questo? –
Il caso specifico in cui mi sono imbattuto quando è sorto questo problema; Ho un'interfaccia che implementa diverse classi. Queste classi sono identificate da un identificatore univoco. Quindi se due identificatori erano uguali, gli oggetti dovrebbero essere considerati uguali. A un certo punto avevo una lista di una di quelle classi e volevo sapere se un nuovo oggetto esisteva già nella lista. Ho pensato che sarebbe stato elegante usare List.contains (..) per questo controllo. Ma ciò richiederebbe che potessi essere certo che l'uguaglianza fosse superata. Facile da risolvere in altri modi però. Anche una classe astratta avrebbe funzionato bene. – Fredrik