【问题标题】:Method overloading not working with different parameters [duplicate]方法重载不适用于不同的参数[重复]
【发布时间】:2013-03-26 06:09:04
【问题描述】:

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

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

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

【问题讨论】:

  • @DuncanJones - 我现在看到了,但真的找不到那个问题。不知道什么是擦除...
  • 别担心——一旦知道答案,重复的就更容易找到了。

标签: java generics overloading


【解决方案1】:

都市神话的答案是:

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

Map&lt;X, Y&gt; 变成了 Map

但是,实际答案似乎更复杂。从duplicate question 看到这个excellent answer。考虑到提供的参数,编译器实际上非常有能力选择正确的重载方法,但是支持遗留的非泛型感知代码的要求迫使javac 开发人员禁止它。

【讨论】:

  • 但是重载是在编译时完成的。
  • @artbristol 实际上你说的很对。更详细地阅读了我链接的副本中的答案后,这显然是一种语言语法限制。遗憾的是,我现在无法删除这个答案,因为它已被接受,但我会同时包含指向另一个答案的链接。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多