以下代码会出现编译错误,错误为“重复方法”
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";
}
如果有重复的方法,第二个代码如何正常运行而不会出现任何编译错误?
答案 0 :(得分:3)
List
的{{1}}和String
的{{1}}不能直接对话,因此方法不同。没错。
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将无法确定应该调用哪两个函数。