java Forzare una classe per sovrascrivere il metodo .equals



6 Answers

Puoi estendere i tuoi oggetti da un XObject astratto piuttosto che da java.lang.Object?

public abstract class XObject
 extends Object
{
@Override
public abstract boolean equals(Object o);
}
java interface override equals requirements

Ho un sacco di classe che implementano un'interfaccia comune: Command.

E questo gruppo di classi va a una mappa.

Per far funzionare correttamente la mappa, ho bisogno di ogni classe che implementa il comando per sovrascrivere il Object.equals(Object other) .

va bene.

Ma mi piacerebbe forzare l'override degli eguali. => Hanno un errore di compilazione quando qualcosa che implementa il comando non sovrascrive equivale.

È possibile?

Modifica: BTW, avrò anche bisogno di forzare l'override di hashcode ...




Questo sarebbe possibile solo se Command fosse un'interfaccia o una classe astratta, dove equals (..) è un metodo dichiarato come abstract.

Il problema è che Object, che è la superclasse di tutti gli oggetti, già definisce questo metodo.

Se desideri indicare che si tratta di un problema (in fase di esecuzione), potresti generare un'eccezione per forzare gli utenti della tua API a sovrascriverla. Ma non è possibile al momento della compilazione, almeno per quanto ne so.

Cerca di aggirare il problema, utilizzando un metodo specifico dell'API, ad esempio CommandEquals. L'altra opzione è (come detto) estendere un'altra classe che definisce un metodo astratto Equals.




interface A{
    public boolean equal2(Object obj);
}

abstract class B implements A {

    @Override
    public boolean equals(Object obj) {
        return equal2(obj);
    }

}


class C extends B {

    public boolean equal2(Object obj) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}



Non penso sia possibile forzare l'override degli uguali come viene dalla classe Object.

Su una nota correlata, si noti che è necessario sovrascrivere il metodo 'hashCode' dalla classe Object quando si esegue l'override di uguali. Ciò diventa particolarmente importante se intendi utilizzare le istanze delle tue classi come chiavi di una mappa. Controlla questo articolo: http://www.artima.com/lejava/articles/equality.html che fornisce alcuni suggerimenti su come sovrascrivere gli equals in modo corretto




Puoi creare boolean myEquals() interface Command e creare Adapter come questo:

class MyAdapter{
  Command c;
  boolean equals(Object x) {
    return c.myEquals((Command)x);
  }
}

Quindi basta usare map.put(key, new MyAdapter(command)) invece di map.put(key, command)




È possibile fornire il proprio java.util.comparator alla mappa in questione?




Related