16

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

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

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

2 回答 2

16

城市神话的答案是:

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

Map<X, Y>变得公正Map

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

于 2013-04-04T08:56:00.013 回答
6

这是因为Type Erasure。Type Erasure 在编译时删除了大部分泛型信息。所以编译后的上面代码是

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

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

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

于 2013-04-04T08:57:25.667 回答