
版权声明:本文为博主原创文章,未经博主允许不得转载。
当泛型遇到了重载,好戏,就发生了。
请看下面代码:
问题:代码能正确编译吗?
这个题目是一个考察泛型的题目。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
-
猜你在找
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。