gpt4 book ai didi

java - 围绕 "same erasure"编译错误的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:15 26 4
gpt4 key购买 nike

我最近偶然发现一段代码由于“相同的删除”问题而无法在我的 Eclipse 中编译(看起来与 this one 非常相似)。编写代码的人向我保证,它可以在他们的本地环境和他们的持续集成中编译,所以我一起玩来模拟它。

看看这个片段:

package com.mycompany.playground;

import java.util.ArrayList;
import java.util.Collection;

public class GenericsTest {

public static void main (String[] args) {
System.out.println(GenericsTest.doSomething(new ArrayList<A>()));
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
}

public GenericsTest() {
}

public static String doSomething(Collection<A> listOfA) {
return "has done something to Collection<A>";
}

public static Integer doSomething(Collection<C> listOfC) {
return 0;
}

private class A {

}

private class C {

}

}

使用 1.6.0_21 JDK 作为默认工作区的 Eclipse Helios 不会编译它,并且会提示方法 doSomething(Collection) 与 GenericsTest 类型中的另一个方法具有相同的删除 doSomething(Collection)。其他方法也是如此。

试图强制 Eclipse 运行它并看到:线程“主”java.lang.Error 中的异常: Unresolved 编译问题:GenericsTest 类型中的方法 doSomething(Collection) 不适用于参数 (ArrayList)。

好的。这是可以预料的。现在。如果我进入我的命令行并运行简单的:

javac GenericsTest.java

它编译。我检查了 1.6.0_21 和 1.6.0_06(他们在他们的环境中使用的那个),但都没有提示。我将类文件复制到 Eclipse 期望的位置并强制它再次运行。

它打印:

has done something to Collection<A>
true

如果我更换

System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));

System.out.println(GenericsTest.doSomething(new ArrayList<C>()));

它仍然会在没有命令行警告的情况下进行编译,但在尝试运行它时会给出相同的“ Unresolved 编译问题”。

这里有两个问题。

  • javac 是否简单地胜过了内置的 Eclipse 编译器?看起来几乎一模一样 this previously asked question所以我相信我知道答案。 (顺便说一下,我如何告诉 Eclipse 使用 javac 来代替?)。

  • 为什么 javac 会静默编译 java 然后将无法运行的内容(第二种情况删除了 {0 ==}“提示”?

最佳答案

根据Java规范,两个方法应该通过签名(名称+参数类型)来区分,而不是返回类型。由于 JDK 中的一个错误,原始代码可以编译 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950此错误已在某些版本的 Eclipse 中得到修复,这就是为什么有些人无法在 Eclipse 中编译它的原因。至于编译后的代码为什么能实际运行,应该明白Java语言不等同于JVM字节码。在字节码中,您可以有很多非法的 Java 名称,是的,字节码通过签名、返回类型和可能的一些附加信息来区分方法。

关于java - 围绕 "same erasure"编译错误的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3965331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com