有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

为什么不允许这样做并将其视为同一个签名

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

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

共 (2) 个答案

  1. # 1 楼答案

    这是因为Type Erasure。类型擦除会在编译时删除大部分泛型信息。因此,编译后的上述代码将是

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

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

  2. # 2 楼答案

    城市神话的答案是:

    Because type erasure causes the generics information to be lost. At runtime, those methods appear identical.

    Map<X, Y> becomes just Map.

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