gpt4 book ai didi

如果存在内部类,则包含美元符号的 Java 类名无法编译

转载 作者:IT老高 更新时间:2023-10-28 21:04:37 24 4
gpt4 key购买 nike

我定义了以下 Java 类:

mac-grek:javajunk grek$ cat A\$B.java
class A$B {}
mac-grek:javajunk grek$ cat A.java
public class A {
public static class B {}
}
mac-grek:javajunk grek$ cat Main.java
public class Main {

public static void main(String[] args) {
System.out.println(A.B.class.getName());
System.out.println(A$B.class.getName());
}

}

当我尝试编译它们时,出现以下错误:

mac-grek:javajunk grek$ javac 'A$B.java' A.java Main.java
A.java:2: duplicate class: A.B
public static class B {}
^
Main.java:4: cannot find symbol
symbol : class B
location: class A
System.out.println(A.B.class.getName());
^
Main.java:5: cannot find symbol
symbol : class A$B
location: class Main
System.out.println(A$B.class.getName());
^
3 errors

如果我从 Main.java 中删除 A.java 文件和 System.out.println(A.B.class.getName());一切编译:

mac-grek:javajunk grek$ cat A\$B.java 
class A$B {}
mac-grek:javajunk grek$ cat Main.java
public class Main {

public static void main(String[] args) {
System.out.println(A$B.class.getName());
}

}
mac-grek:javajunk grek$ javac A\$B.java Main.java
mac-grek:javajunk grek$

所以 Java 允许我定义一个名称中包含美元符号的类。如何编译我的原始示例?

最佳答案

您有一个名称冲突,因为您定义了一个顶级类 A$B,它与为类 A 的静态内部类 B 生成的名称相同。由于两者都有,编译器无法解决冲突.

The JLS说:

The $ character should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems.

由于您决定不遵守该规则,因此您被 javac 咬了。我只是将 A$B 重命名为其他名称。

关于如果存在内部类,则包含美元符号的 Java 类名无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6167326/

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