为什么这不被允许并被视为相同的签名?
public Object myMethod(Map<String, String[]> values) {
return this;
}
public Object myMethod(Map<String, String> values) {
return this;
}
答案 0 :(得分:15)
城市神话的答案是:
因为type erasure导致泛型信息丢失。在运行时,这些方法看起来完全相同。
Map<X, Y>
变为Map
。
然而,实际答案似乎更复杂。从excellent answer中查看此duplicate question。在给定提供的参数的情况下,编译器实际上能够选择正确的重载方法,但是支持遗留的非泛型代码的要求迫使javac
开发人员禁止它。
答案 1 :(得分:5)
这是因为Type Erasure。类型Erasure在编译时删除所有泛型信息。因此编译后的代码将是
public Object myMethod(Map values) {
return this;
}
public Object myMethod(Map values) {
return this;
}
因此两种方法在运行时都是相同的。