class Test1{ public void sum(List<Integer> list) { } public void sum(List<String> list) { } }
此时编译器会报错,因为java的泛型是伪泛型(c#是真泛型),为什么说是伪泛型呢?
因为Java泛型只存在于源代码中,编译后,泛型信息已经被"擦除"了。编译后类似:
class Test1{ public void sum(List<E> list) { } public void sum(List<E> list) { } }
两个函数具有相同的签名,当然编译器会拒绝为我们编译这样的代码。
class Test2{ public Integer sum(List<Integer> list) { } public String sum(List<String> list) { } }
这段代码能正常编译吗?答案是,这段代码能正常编译(重载成功了)。而且还能正常执行!
jvm规定,函数的返回类型并不参与“函数特征签名”的生成,那为什么能编译成功呢?
是因为在class文件中,只要描述符不完全一致的两个方法就能共存于一个class文件中。
字节码中,特征签名还包括了方法的返回值以及受查异常表,这就是为什么在class文件中,仅仅返回值不同的两个方法能共存的原因。