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.