JAVA中当泛型遇到重载

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文件中,仅仅返回值不同的两个方法能共存的原因。

原文地址:https://www.cnblogs.com/shijianchuzhenzhi/p/13056750.html