java的行为和方法_在重载通用方法时Java 5和6之间的不同行为

我在Java的泛型中遇到了一个问题,其中相同的代码将在Java 6中编译和正常工作,但是由于Java 5中的相同擦除将无法编译。我有一个具有重载方法的文件TestErasure.java ,称为“方法”:

import java.util.ArrayList;

import java.util.List;

public class TestErasure {

public static Object method(List list) {

System.out.println("method(List list)");

return null;

}

public static String method(List list) {

System.out.println("method(List list)");

return null;

}

public static void main(String[] args) {

method(new ArrayList());

method(new ArrayList());

}

}

在Java 5中,我得到预期的编译错误,指出“方法”的擦除是相同的:

$ javac -version

javac 1.5.0_19

$ javac TestErasure.java

TestErasure.java:10: name clash: method(java.util.List) and method(java.util.List) have the same erasure

public static String method(List list) {

^

TestErasure.java:17: method(java.util.List) in TestErasure cannot be applied to (java.util.ArrayList)

method(new ArrayList());

^

2 errors

但是,Java 6能够编译和运行相同的代码。

$ javac -version

javac 1.6.0_16

$ javac TestErasure.java

$ java TestErasure

method(List list)

method(List list)

根据我目前对erasures的理解(感谢Jon Skeet和Angelika Langer),我实际上预期Java 5抛出的编译错误(除非Java处理泛型的情况发生了变化 – 我在Java 6发行说明中找不到)。其实如果我修改一个重载方法的返回类型:

public static Object method(List list) ...

public static Object method(List list) ...

由于相同的擦除,Java 6也无法编译:

$ javac TestErasure.java TestErasure.java:5: name clash: method(java.util.List) and method(java.util.List) have the same erasure

public static Object method(List list) {

^

TestErasure.java:10: name clash: method(java.util.List) and method(java.util.List) have the same erasure

public static Object method(List list) {

^

2 errors

看起来Java 6中的返回类型会影响使用哪种重载方法的选择?

有人可以说明为什么第一个例子在Java 6中工作 – 似乎违反了重载泛型方法的规定处理?

更多信息:

根据David的建议,原来的例子,由javac 1.6所遵循,将运行在java 1.5:

$ javac -target 1.5 TestErasure.java

$ java -version

java version "1.5.0_19"

$ java TestErasure

method(List list)

method(List list)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值