La razón es type erasure. Los genéricos no se almacenan en las clases, solo son información en tiempo de compilación, por lo que en tiempo de ejecución, los dos métodos son idénticos y, por lo tanto, hay un conflicto de nomenclatura.
Referencia
Estos tres métodos son en realidad idénticos (es decir: que producen bytecode idéntico):
public static void a(Set plainSet) {}
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
Si realmente desea tener dos métodos separados, debe proporcionar diferentes firmas de métodos (p. diferentes nombres de métodos, un parámetro adicional para uno de los métodos, etc.)
¿Cuál es el error? – kasten