Java-当泛型遇到重载

请看下面代码:

public class GenericTypes {
public static void method(List<String> list){//类型擦除  变成原生类型List list
System.out.println("method(List<String> list)");
}
public static void method(List<Integer> list){
System.out.println("method(List<Integer> list)");
}
}


这个题目是一个考察泛型的题目。Java里面,泛型实际上是“伪泛型”,编译不通过 

IDE会提示我们下面的错误:

Erasure of method method(List<String>) is the same as another method in type GenericTypes

在java中,泛型只存在于源代码之中,在编译过后的代码中,泛型信息已经被“擦除”了。上面的代码被编译之后的样子应该是下面类似的代码:

public class GenericTypes {
public static void method(List<T> list){ 
System.out.println("method(List<String> list)");
}
public static void method(List<T> list){
System.out.println("method(List<Integer> list)");
}
}

两个函数具有相同的签名,当然编译器会拒绝为我们编译这样的代码。


请再看下面一个例子

看下面代码:

public class GenericTypes2 {
public static String method(List<String> list){//类型擦除  变成原生类型List list
  return "string";
}
  public static Integer method(List<Integer> list){
  return 1;
  }
}

这段代码能正常编译吗?

熟悉class文件结构的人能知道,这段代码能正常编译(重载成功了!)。而且还能正常执行 

 【请注意 重载成功 仅限于jdk1.6及以下,jre1.7 是编译不通过的 】

原因在于,虽然函数的返回值不参与函数签名的生成,但是在class文件格式之中,只要描述符不完全一致的两个方法就能共存于一个class文件中。

 


 




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值