方法重载不适用于不同的参数

2022-09-03 06:16:12

为什么不允许这样做,并将其视为相同的签名?

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

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

答案 1

城市神话的答案是:

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

Map<X, Y>变得只是.Map

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


答案 2

这是因为类型擦除。类型擦除在编译时删除大多数泛型信息。所以上面的代码在编译后会是

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

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

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