如果存在内部类,则包含美元符号的Java类名无法编译 [英] Java class name containing dollar sign fails to compile if an inner class is present
问题描述
我已经定义了以下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屋!