Причина: type erasure. Дженерики не хранятся в классах, они являются только информацией времени компиляции, поэтому во время выполнения эти два метода идентичны, и, следовательно, существует конфликт имен.
Ссылка
Эти три метода практически идентичны (читай: они производят одинаковую байткод):
public static void a(Set plainSet) {}
public static void a(Set<String> stringSet) {}
public static void a(Set<Map<String,String>> mapSet) {}
Если вы действительно хотите иметь два разных метода, вы должны предоставить различные сигнатуры методов (например, разные имена методов, дополнительный параметр для одного из методов и т. д.)
Какая ошибка? – kasten