5

以下代码给出了错误“重复方法”的编译错误

static int test(int i){
     return 1;
}

static String test(int i){
     return "abc";
}

这是意料之中的,因为两个重载方法都具有相同的签名,并且仅在返回类型上有所不同。

但是下面的代码可以正常编译并发出警告:

static int test1(List<Integer> l){
    return 1;
}

static String test1(List<String> l){
    return "abc";
}

正如我们所知,Java 泛型适用于 Erasure,这意味着在字节码中,这两种方法具有完全相同的签名并且返回类型不同。

此外,令我惊讶的是,以下代码再次给出了编译错误:

static int test1(List<Integer> l){
    return 1;
}

static String test1(List l){
    return "abc";
}

尽管有重复的方法,第二个代码如何在没有任何编译错误的情况下正常工作?

4

4 回答 4

3
  1. 如果参数相同,Java 无法确定使用哪一个。因此,它会引发重复的方法错误。
  2. ListofStringListofInteger不能直接转换,所以方法不同。没有错误。
  3. ListofInteger也可以用作普通的任何东西,因此如果提供了of -> 重复方法错误List,Java 无法确定使用哪个。ListInteger
于 2013-05-04T19:13:00.540 回答
2

解析重载方法是在编译时完成的,而不是在运行时完成,因此 Java 编译器会在您的第二个示例中知道两者之间的区别。在您的第三个示例中,问题是 aList<Integer>也是 a List,因此如果您传入 a ,它将不知道要使用哪个List<Integer>

于 2013-05-04T19:13:01.947 回答
0

方法重载的基本更改:参数必须不同。在您的情况下,两种方法test始终使用相同的参数。其次,返回类型可能会或可能不会改变。请尝试第一个示例。

static int test(int i){
return 1;
}

static String test(List l){
return "abc";
}

您的第二个示例有效,因为两个List<String>List<Integer>是两个不同的参数。

第三个示例失败,因为整数列表也可以用作列表。如果将整数列表作为参数传递代码运行后,Java 将无法确定应该调用两个函数中的哪一个。

于 2013-05-04T19:34:40.633 回答
0

第一个结果是预期的并且是正确的。

现在让我们谈谈第二个

让我们尝试调用这些函数。

List<Integer> intList;
List<String> strList;
test1(intList)
test1(strList)

编译器将调用相应的方法。

现在第三

List<Integer> intList;
List unknownList;
test1(intList);
test1(unknownList);

哇!!编译器现在应该调用哪个方法!!因为unknowList可以是一个ListIntegers希望能帮助到你。

于 2013-05-04T19:22:49.157 回答