方法重载不使用不同的参数

use*_*048 15 java generics overloading

为什么这不允许和被视为相同的签名?

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

public Object myMethod(Map<String, String> values) {
   return this;
}
Run Code Online (Sandbox Code Playgroud)

Dun*_*nes 15

城市神话的答案是:

因为类型擦除导致泛型信息丢失.在运行时,这些方法看起来相同.

Map<X, Y>变得公正Map.

但是,实际答案似乎更复杂.从重复的问题中看到这个优秀的答案.在给定提供的参数的情况下,编译器实际上能够选择正确的重载方法,但是支持遗留的非泛型代码的要求迫使开发人员禁止它.javac


Sac*_*ade 5

这是因为类型擦除.类型Erasure在编译时删除所有泛型信息.所以编译之后的代码就是

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

public Object myMethod(Map values) {
   return this;
}
Run Code Online (Sandbox Code Playgroud)

所以这两种方法在运行时都是相同的.