方法重载时重复的方法

时间:2013-05-04 19:08:37

标签: java generics overloading type-erasure erasure

以下代码会出现编译错误,错误为“重复方法”

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 Generics在Erasure上工作,这意味着在字节码中,这两种方法都具有完全相同的签名,并且与返回类型不同。

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

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

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

如果有重复的方法,第二个代码如何正常运行而不会出现任何编译错误?

4 个答案:

答案 0 :(得分:3)

  1. 如果参数相同,Java无法确定使用哪一个。因此,它会引发重复的方法错误。
  2. List的{​​{1}}和String的{​​{1}}不能直接对话,因此方法不同。没错。
  3. List Integer也可以用作任何内容的普通List,因此如果提供Integer {{{{}},则Java无法确定使用哪一个1}} - &gt;重复方法错误。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

现在谈谈第二次

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

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

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

现在第3次

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

哇!!编译器现在应该调用哪个方法!!因为unknowList可以是List Integers。 希望它有所帮助。

答案 3 :(得分:0)

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

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

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

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

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