Quote Originariamente inviata da Giuso Visualizza il messaggio
Ho un hashmap<Vertex, LinkedList<Vertex>> dove Vertex è appunto la mia interfaccia. I miei metodi accettano un Vertex v. Se io voglio verificare se il Vertex v passato come parametro è contenuto nella mia hashmap, potrei farlo con hash.containsKey(v). Il problema è che quel Vertex che passo al mio metodo sarà un vertice inserito dall'utente nel main, pertanto verrà istanziato con una new VertexImpl. Ora mi chiedo: la containsKey() funziona se i due tipi sono "diversi"? A quanto pare no. Quindi mi vien da pensare che nonostante entrambi gli oggetti abbiano il campo intero uguale, java li vede diversi, perchè?
Chiariamo una cosa: il containsKey(Object) delle mappe si basa sul metodo equals(Object) degli oggetti.

Ora, dimentica per una attimo le interfacce. Nel metodo equals di norma si fa innanzitutto un test con l'operatore instanceof (che testa la relazione detta IS-A, "è-un") e talvolta invece di instanceof si fa un test più "stretto" direttamente sul Class dell'oggetto.
In sostanza di norma si fa in modo che classi scorrelate (non in relazione tra di loro) NON siano comparabili per uguaglianza. Un String non può essere uguale ad altro, un Integer non può essere uguale ad un Long, ecc...

Le interfacce NON c'entrano in questo. Se hai una interfaccia Vertex ed avessi ipoteticamente 2 implementazioni VertexImpl1 e VertexImpl2, è presumibile e ragionevole fare in modo che il equals di VertexImpl1 si aspetti di ricevere SOLO oggetti VertexImpl1 (e nient'altro) e in maniera similare il equals di VertexImpl2 si aspetti di ricevere SOLO oggetti VertexImpl2.

Questo perlomeno è ciò che si fa di norma. Tanto per esempio: String, StringBuilder e StringBuffer sono implementazioni della interfaccia CharSequence. Ma un oggetto String NON è mai "uguale" ad un StringBuilder o StringBuffer .. nemmeno se rappresentano la stessa sequenza di caratteri.

Quindi come vedi il punto NON è la interfaccia ma la scelta all'interno di ciascuna classe riguardo la implementazione di equals().

Pertanto, se tu del tuo Vertex hai una sola implementazione (VertexImpl), allora non importa chi/dove istanzia i VertexImpl. Se il suo equals() è corretto/appropriato allora due oggetti VertexImpl DISTINTI, possono essere "uguali" se hanno lo stesso significato secondo la implementazione di equals.

E nota: visto che i Vertex sono usati come "chiavi" in HashMap, allora DEVE essere implementato anche il hashCode() adeguatamente.