Ich habe eine eher zentrale Klasse, die für einige Utility-Methoden zuständig ist. Ich wollte eine zusätzliche Überlast für ein Verfahren bereitzustellen, das wie folgt erklärt:Löschen von Sammlungen Generika und konfliktbehaftete Überladungen
public static void removeDuplicated(Collection fullList, Collection itemsToRemove) {
//implementation stripped for brevity
}
Jetzt, da ich wie Rawtypes nicht wirklich tun, ich die Sammlungen in den kleinsten gemeinsamen Nenner angegeben aus kann ich erwarten:
public static void removeDuplicated(Collection<Map<?,?>> fullList,
Collection<Map<?,?>> itemsToRemove) {}
So weit so gut, das hat die Rawtypes Warnung losgelassen und alles ist in Ordnung bis jetzt.
Ich ging die Methode Header für meine Überlastung zu schreiben:
public static <T extends TeObjectWrapper> void removeDuplicated(
Collection<T> fullList, Collection<Map<?,?>> itemsToRemove) {}
Dies ist, wenn Eclipse (und anschließend mit javac6 über ant kompilieren) gab mir folgende Fehlermeldung:
Erasure von Methode
removeDuplicated(Collection<T>, Collection<? extends Map<?,?>>)
ist das gleiche wie eine andere Methode im Typ [Utilites-Klasse]
Jetzt seit ich hatte schon meinen Anteil von Pro Probleme mit Platzhalter-Generika und deren Löschungen Ich habe versucht, Dinge komplett zu spezifizieren, indem ich die ungebundenen Platzhalter durch Object
ersetzte. Die Fehlermeldung bleibt weiterhin bestehen.
Nun, wie ich es verstehe, sollte die erste vorhandene Überladung zu Collection<Map<Object, Object>>
löschen und die zweite sollte zu Collection<TeObjectWrapper>
löschen.
Die einzige Möglichkeit, dass die gleiche Löschung sein könnte, ist, wenn TeObjectWrapper Map implementiert (oder eine der Implementierungsklassen von Map erweitert), aber das ist nicht der Fall. Das kann in der Hierarchie übergeordneter Typ von TeObjectWrapper zu sehen:
Warum der Compiler betrachten die Löschungen gleich und wie kann ich ihm das nicht denken?
Die Löschung von 'Collection' ist 'Collection'. –
Aufgrund des Löschens ist die Methodensignatur identisch. Das Mischen mit den Generika ändert die Methodensignatur nicht. – user489041