返回信息流java中的泛型是一种形式上的泛型,并不是C#那样真实的泛型。因为在编译的过程中进行了泛型擦除。
对于重载来说,函数签名不同,编译即可通过。但是方法的返回值类型是不列入函数签名的。
但是如下所示(在JDK1.6中)
public String test1(List<String> s){
return "";
}
public int test1(List<Integer> s){
return 1;
}
这样的编译是可以通过的,在JDK1.7中貌似做了修正,编译不能通过。
问题:
1.为什么加入泛型的重载可以编译通过?
2.JDK1.7做了什么修正,使得这种方式的重载不能通过?
这是一条镜像帖。来源:北邮人论坛 / java / #51894同步于 2016/7/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]泛型擦除与重载的问题(JDK1.6)
mh250303135
2016/7/25镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
等大神出现。周志明虚拟机 第十章早期编译优化中 虽然没给出这问题的答案。但是貌似有个切入点,字节码层面的重载和java代码层面的重载是不一样的,可以参考下p311的10.3.1节
这应该是jdk的一个BUG,相关链接:http://bugs.sun.com/view_bug.do?bug_id=6182950 http://bugs.sun.com/view_bug.do?bug_id=6730568
并且java中的重载是在编译期确定下来的,受限于参数的静态类型,而非实际类型。
【 在 dongqing 的大作中提到: 】
: 为什么编译不通过?
重载与返回值无关,泛型在编译的时候擦除,List<String>与List<Integer>是同一个class