如果存在内部类,则包含美元符号的Java类名无法编译 [英] Java class name containing dollar sign fails to compile if an inner class is present

查看:117
本文介绍了如果存在内部类,则包含美元符号的Java类名无法编译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经定义了以下Java类:

I've got following Java classes defined:

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());
  }

}

当我尝试编译它们时,我收到以下错误:

When I try to compile them, I get following errors:

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(ABclass.getName()); 来自 Main.java 所有内容编译:

If I remove A.java file and System.out.println(A.B.class.getName()); from Main.java everything compiles:

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允许我定义一个包含美元符号的类。如何编译原始示例?

So Java allows me to define a class containing dollar sign in it's name. How can I compile my original example?

推荐答案

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

You have a name conflict because you defined a top-level class A$B having the same name as the generated name for a static inner class B of class A. Since you have both, the compiler can't resolve the conflict.

JLS 说:


$字符只能用于机械生成的源代码,或者很少用于访问pre遗留系统上现有的名称。

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

既然你决定不尊重这条规则,你就被javac咬了。我只想将A $ B重命名为其他东西。

Since you decided not to respect that rule, you got bitten by javac. I would just rename A$B to something else.

这篇关于如果存在内部类,则包含美元符号的Java类名无法编译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆