当泛型遇到重载

本文探讨了Java中泛型与方法重载的特殊交互现象,揭示了在不同JDK版本下,看似相同的泛型方法如何通过改变返回类型实现重载,并解释了这一现象背后的字节码层面的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当泛型遇到重载

标签: 泛型重载
  5001人阅读  评论(10)  收藏  举报
  分类:
 

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

请看下面代码:

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

这个题目是一个考察泛型的题目。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文件中,其他都相同仅仅返回值不同的两个方法能共存的原因】

1
0
 
 
我的同类文章
 

参考知识库

img
Java SE知识库

img
Java EE知识库

img
Java 知识库

猜你在找
JavaAndroid客户端和C#服务端Web Api接口开发
Java基础核心技术:泛型(day14)
深入浅出Java的反射
深入浅出Java5新特性
JavaSE之语言包实战视频课程
查看评论
9楼  akka_li 2016-08-26 17:12发表 [回复]
在eclipse中用jdk1.6,是能编译通过的!而jdk1.7、jdk1.8都不能通过,本来也想问5楼哥们的问题的,但一想人家sun都默默的修复了这个问题,说明这里面没什么原理可讲的,而是一个bug,哈哈...
8楼  上官寂伦 2016-05-24 16:23发表 [回复]
oh sorry 看见了,只能使用Sun JDk 1.6的javac才能编译成功
7楼  上官寂伦 2016-05-24 16:22发表 [回复]
1.7 不行啊 不管是Eclipse还是使用javac命令都提示错误
6楼  xh2018sjl 2016-04-26 12:31发表 [回复]
我用1.8是编译不通过的
5楼  bboy_wm 2015-08-04 18:24发表 [回复]
普通方法描述符也不一样为什么就不能共存于一个class文件中了??
4楼  bboy_wm 2015-08-04 18:05发表 [回复]
用javac 就好了。。。
3楼  sunny-sky 2015-05-04 15:18发表 [回复]
1.6、1.7都已测试,eclipse直接报错
2楼  佬油条 2015-03-24 18:02发表 [回复]
不行啊,我的也是jdk1.6,编译报错呢。
1楼  夜宿荒寺 2013-09-17 19:29发表 [回复]
问一下,你用的JDK版本是多少?我在JDK7上,编译还是通不过,是JDK版本的问题吗?
Re:  imzoer 2013-09-18 15:16发表 [回复]
回复夜宿荒寺:当时应该是用的1.6。
* 以上用户言论只代表其个人观点,不代表优快云网站的观点或立场

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值