Перегрузка метода не работает с разными параметрами
Почему это не разрешено и не рассматривается как одна и та же подпись?
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;
}
Таким образом, оба метода идентичны во время выполнения.