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

2023-12-23

我定义了以下 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

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

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 http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.8 says:

$ 字符应仅在机械生成的源代码中使用,或者很少用于访问遗留系统上预先存在的名称。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果存在内部类,包含美元符号的 Java 类名将无法编译 的相关文章

随机推荐