Der Grund ist Löschvorgang . Generics werden nicht in den Klassen gespeichert, sie sind nur Informationen zur Kompilierung, daher sind beide Methoden zur Laufzeit identisch und daher gibt es einen Namenskonflikt.
Referenz
Diese drei Methoden sind tatsächlich identisch (lesen: sie erzeugen einen identischen Bytecode):
%Vor%Wenn Sie wirklich zwei separate Methoden haben möchten, müssen Sie verschiedene Methodensignaturen angeben (z. B. unterschiedliche Methodennamen, einen zusätzlichen Parameter für eine der Methoden usw.).
Aus der Sicht der Methoden sind die Parameter Set<String>
und Set<Map<String,String>>
identisch, da alle Instanzen einer generischen Klasse die gleiche Laufzeitklasse haben (in Ihrem Fall gesetzt), unabhängig von ihren tatsächlichen Typparametern . Daher erhalten Sie erasure error
. Auch zur Laufzeit werden beide aussehen ...
public static void a(Set stringSet) {}
UND
public static void a(Set mapSet) {}