当泛型遇到了重载
来源:互联网 发布:数据透视表求和显示0 编辑:程序博客网 时间:2024/04/29 16:41
当泛型遇到了重载,好戏,就发生了。
请看下面代码:
问题:代码能正确编译吗?
这个题目是一个考察泛型的题目。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文件中,其他都相同仅仅返回值不同的两个方法能共存的原因】
- 当泛型遇到了重载
- 当泛型遇到重载
- 当泛型遇到重载
- 当泛型遇到重载
- Java-当泛型遇到重载
- 当泛型遇见重载
- 当函数重载遇到函数指针
- 当iBatis遇到了Spring
- 当WPF遇到了gif
- 当友元类遇到了继承
- 当WPF遇到了gif
- 当CompositeSubscription遇到了FragmentManager
- Java重载遇到泛型
- 当重载方法遇上了params
- [转]当层遇到了select框时
- 当OO遇到了持久化?!
- 当printf遇到了i++ 或++i
- 当融合基础遇到了私有云
- 最伟大的计算机程序员是如何诞生的?——解读高德纳(Donald E.Knuth)
- 圆周率求解
- MONO for Android ILocationListener接口实现
- avl实现
- [pgf and tikz]foreach的高级用法:同时循环两个变量
- 当泛型遇到了重载
- 使用BTstack实现IOS设备与非IOS设备之间的通信
- Introduce My Work 2
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
- 关于EAS 套打配置审批结果信息的相关思路
- IO流-08
- HDU 4513 完美队形II (Manacher)
- XMU1428 求递归的次数 帅额
- 客户端连接oracle数据库慢,listener.log文件4G,解决方法