Перегрузка метода не работает с разными параметрами

Почему это не разрешено и не рассматривается как одна и та же подпись?

public Object myMethod(Map<String, String[]> values) {
   return this;
}

public Object myMethod(Map<String, String> values) {
   return this;
}

Ответы

Ответ 1

Городской миф:

Поскольку type erasure приводит к потере информации генериков. Во время выполнения эти методы выглядят идентичными.

Map<X, Y> становится просто Map.

Однако реальный ответ представляется более сложным. См. отличный ответ из дублирующего вопроса . Компилятор на самом деле вполне способен выбрать правильный перегруженный метод с учетом поставленных аргументов, однако требование поддержки устаревшего кода, не поддерживающего генераторы, вынудило разработчиков javac запретить его.

Ответ 2

Это связано с Type Erasure. Тип Erasure удаляет всю информацию о генериках во время компиляции. Таким образом, над кодом после компиляции будет

public Object myMethod(Map values) {
   return this;
}

public Object myMethod(Map values) {
   return this;
}

Таким образом, оба метода идентичны во время выполнения.