Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java5和;6当重载泛型方法时_Java_Generics_Jvm - Fatal编程技术网

Java5和;6当重载泛型方法时

Java5和;6当重载泛型方法时,java,generics,jvm,Java,Generics,Jvm,我在Java的泛型中遇到了一个问题,在Java 6中,相同的代码可以编译并正常工作,但在Java 5中,由于相同的擦除,无法编译。我有一个文件TestErasure.java,它有一个重载方法,称为“method”: import java.util.ArrayList; 导入java.util.List; 公共类测试员{ 公共静态对象方法(列表){ System.out.println(“方法(列表)”; 返回null; } 公共静态字符串方法(列表){ System.out.println(

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

import java.util.ArrayList;
导入java.util.List;
公共类测试员{
公共静态对象方法(列表){
System.out.println(“方法(列表)”;
返回null;
}
公共静态字符串方法(列表){
System.out.println(“方法(列表)”;
返回null;
}
公共静态void main(字符串[]args){
方法(新的ArrayList());
方法(新的ArrayList());
}
}
在Java 5中,我得到了预期的编译错误,指出“method”的擦除是相同的:

$ javac -version
javac 1.5.0_19
$ javac TestErasure.java
TestErasure.java:10: name clash: method(java.util.List<java.lang.String>) and method(java.util.List<java.lang.Object>) have the same erasure
        public static String method(List<String> list) {
                             ^
TestErasure.java:17: method(java.util.List<java.lang.Object>) in TestErasure cannot be applied to (java.util.ArrayList<java.lang.String>)
      method(new ArrayList<String>()); 
            ^
2 errors
$javac-version
JavaC1.5.0_19
$javac TestErasure.java
java:10:name clash:method(java.util.List)和method(java.util.List)具有相同的擦除
公共静态字符串方法(列表){
^
java:17:TestErasure中的方法(java.util.List)不能应用于(java.util.ArrayList)
方法(新的ArrayList());
^
2个错误
但是,Java6能够编译和运行相同的代码

$ javac -version
javac 1.6.0_16
$ javac TestErasure.java
$ java TestErasure
method(List<Object> list)
method(List<String> list)
$javac-version
JavaC1.6.0_16
$javac TestErasure.java
$java测试软件
方法(列表)
方法(列表)
根据我目前对擦除的理解(多亏了和),我实际上预期Java 5会引发编译错误(除非Java处理泛型的方式发生了一些变化——这在Java 6发行说明中找不到)。事实上,如果我修改其中一个重载方法的返回类型:

public static Object method(List<Object> list) ...
public static Object method(List<String> list) ...
公共静态对象方法(列表)。。。
公共静态对象方法(列表)。。。
由于相同的擦除,Java 6也无法编译:

$ javac TestErasure.java TestErasure.java:5: name clash: method(java.util.List<java.lang.Object>) and method(java.util.List<java.lang.String>) have the same erasure
     public static Object method(List<Object> list) {
                          ^
TestErasure.java:10: name clash: method(java.util.List<java.lang.String>) and method(java.util.List<java.lang.Object>) have the same erasure
     public static Object method(List<String> list) {
                          ^
2 errors
$javac TestErasure.java TestErasure.java:5:name clash:method(java.util.List)和method(java.util.List)具有相同的擦除
公共静态对象方法(列表){
^
java:10:name clash:method(java.util.List)和method(java.util.List)具有相同的擦除
公共静态对象方法(列表){
^
2个错误
Java 6中的返回类型似乎以某种方式影响了使用哪个重载方法的选择

有人能解释一下为什么第一个示例在Java 6中工作吗?它似乎违背了重载泛型方法的规定

更多信息:

根据David的建议,由JavaC1.6编写的原始示例将在Java1.5下运行:

$ javac -target 1.5 TestErasure.java
$ java -version
java version "1.5.0_19"
$ java TestErasure 
method(List<Object> list)
method(List<String> list)
$javac-target 1.5 TestErasure.java
$java-版本
java版本“1.5.0_19”
$java测试软件
方法(列表)
方法(列表)

在Sun上发现了这些bug,我想这就是您所描述的:



在所有版本的Java中,(已擦除的)返回类型都是方法签名的一部分。@Tom-我相信你弄错了-“定义:方法声明的两个组件包括方法签名、方法名称和参数类型。”方法签名必须是唯一的,方法重载才能工作,并且它们不依赖于返回类型(至少对于Java而言)Java 5的发行版,这对我很有用。我尝试了1.5.0_11和1.5.0_13,得到了与Java 6相同的结果。如果您尝试使用Java 5中编译的代码和/或使用
-target 1.5
编译,会发生什么?哇。我想知道如果他们没有修复错误,而是更改了规范,会有多大的蠕虫。这个错误似乎是be在Netbeans 6.9中展示。针对OpenJDK 7代码的变更集db77bf6adb53(2008年10月23日)包含修复程序:。
$ javac -target 1.5 TestErasure.java
$ java -version
java version "1.5.0_19"
$ java TestErasure 
method(List<Object> list)
method(List<String> list)