泛型遇上重载

转自:http://blog.csdn.net/imzoer/article/details/8039369

当泛型遇到了重载,好戏,就发生了。

请看下面代码:

问题:代码能正确编译吗?

这个题目是一个考察泛型的题目。java里面,泛型实际上是“伪泛型”,并不像C#那样是实际上的泛型。

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

Method test(List<String>) has the same erasure test(List<E>) as another method in type TR

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

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

在java这种伪泛型中,List<String>和List<Integer>,编译之后,是相同的类型。

但是在c#这种真实泛型中,上面两个就是不同的类型了。

故事到这里就结束了吗??显然没有

------------------------------------昏昏咯咯-------------------------------------

看下面代码:

问,这段代码能正常编译吗?

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

代码输出:

integer
string
疑问来了。jvm规定,函数的返回值并不参与“函数签名”的生成,那么仅仅改变了函数返回值,从而让不能编译的代码通过了编译并且能正常执行了,这不是很矛盾吗?

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

【java代码中,函数的特征签名仅仅包括方法名称、参数类型以及参数顺序。但在字节码中,特征签名还包括了方法的返回值以及受查异常表,这就是为什么在class文件中,其他都相同仅仅返回值不同的两个方法能共存的原因】


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值