看下面两个例子,让我们重新认识重载: 例子1:
public class OverloadTest {
public void testType(List<String> list) {
System.out.println("String....");
}
public void testType(List<Integer> list) {
System.out.println("Integer....");
}
}
这两个方法重载是失败的,但是我们知道java的泛型是伪泛型,编译之后类型都被擦除了,因此这段代码不能通过编译,因为String类型和Integer类型被擦除之后,两个方法是一样的。
例子2:
public class OverloadTest {
public String testType(List<String> list) {
System.out.println("String....");
return "";
}
public int testType(List<Integer> list) {
System.out.println("Integer....");
return 1;
}
}
这段代码能够顺利通过编译,并且重载成功了。因为我们加入了返回值吗?这是对java语言中返回值不参与重载选择的基本认知的挑战码? 重载要求方法具有不同的特征签名,返回值并不包含在方法的特征签名之中,所以返回值不参与重载选择,但是在class文件格式中,只要描述符不是完全一致的两个方法就可以共存。也就是两个方法如果有相同的名称和特征签名,但是返回值不同它们就可以合法的共存于一个class文件之中。这也是例子1不能通过编译的原因。