Java-Name-Überschneidungsfehler trotz unterschiedlicher Methodensignaturen

8

Aus Spaß versuche ich, eine "MultiMap" -Sammlung zu implementieren, wie sie bereits in der Apache Commons-Bibliothek existiert. Ich bekomme einen interessanten Fehler mit meiner Methode "remove (K key, V value)". Der Compiler sagt, dass es einen Namenskonflikt gibt - dass er das gleiche Löschen wie "remove (Object, Object) vom Typ Map" hat. Aber es gibt keine solche Methode in der java.util.Map-Schnittstelle definiert! Nur eine "remove (Object)" Methode - mit einem Parameter, im Gegensatz zu meiner zwei Parameter Version. Was noch interessanter ist, ist, dass wenn Sie die Typinformationen manuell entfernen, indem Sie meine "remove (K-Taste, V-Wert)" durch "remove (Objektschlüssel, Objektwert)" ersetzen, wird es gut kompiliert. Kann jemand dieses Phänomen erklären?

Ich führe Java 8 aus, falls das wichtig ist.

%Vor%     
TheBrownMotie 21.05.2014, 14:13
quelle

2 Antworten

13
  

Aber es gibt keine solche Methode in der java.util.Map-Schnittstelle definiert!

There ist a Map#remove(Object, Object) -Methode in der Map -Schnittstelle; es wurde in Java 8 hinzugefügt. Daher der Fehler.

    
arshajii 21.05.2014, 14:18
quelle
1

Dies ist wegen des Löschvorgangs type , wenn ein generischer Java-Typ in Bytecode übersetzt wird.

Zur Laufzeit ist das default boolean remove(Object key, Object value) (diese Methode ist neu in Java 8) in Map dasselbe wie Ihre Methode in der MultiMap-Klasse public boolean remove(K key, V value) .

Der Compiler sieht dies und zeigt daher den Fehler:

Namenskonflikt: Die Methode remove (K, V) vom Typ MultiMap hat die gleiche Löschung wie remove (Object, Object) vom Typ AbstractMap, tut dies aber nicht  überschreiben Sie es.

Siehe hierzu: Ссылка

    
masinger 21.05.2014 19:41
quelle