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

时间:2013-04-04 08:54:34

标签: java generics overloading

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

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

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

2 个答案:

答案 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;
}

因此两种方法在运行时都是相同的。