错位的嵌套类namein Java语言规范(Mangled nested class namein

2019-10-28 16:09发布

考虑以下两类:

// a.java
public class a
{
    public static class $b
    {

    }
}


// a$.java
public class a$
{
    public static class b
    {

    }
}

显然,由于内/嵌套类名字改编,一个$ .B和$ B都将被编译到一个名为$$ b.class类文件。 当命令javac a.java a$.java被执行时,在Oracle的Java编译器(javac 1.7.0_45)产生以下输出:

a$.java:3: error: duplicate class: a.$b
    public static class b
                  ^
1 error

当它在Java语言规范中说,这些类名( a$.ba.$b )冲突,或者这只是一个建立规则,由于具有相同名称的输出文件?

Answer 1:

6.1指向3.8它说:

一个标识符是对Java字母和Java数字,其中第一个必须是一个Java信无限长度的序列。

...

通过 “Java字母” 包括大写和小写ASCII拉丁字母AZ(\ u0041- \ u005a)和AZ(\ u0061- \ u007a),并且,由于历史原因,ASCII下划线(_,或\ u005f)和美元符号($或\ u0024)。 $符号应该仅在机械上生成的源代码使用,或者很少,访问遗留系统预先存在的名称

(重点煤矿)

但实际上,它只是一个你有字节码生成后重复类名的问题。 将与不涉及到两个相冲突的类名会出现同样的错误$源。

编辑补充:二进制格式在指定13.1



文章来源: Mangled nested class namein the Java Language Specification