为什么我不能拥有一个与其包含类同名的两层深度内部类?

Tre*_*kaz 6 java inner-classes

今天,其他一些开发人员发现了一个带有一些有趣嵌套的XML模式,JAXB编译成这样的结构:

public class Choices
{
    public static class Choice
    {
        public static class Choice
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试编译它,Java编译器说,

class Choices.Choice is already defined in class Choices
Run Code Online (Sandbox Code Playgroud)

当然,最内层class Choice声明的下划线.

但我说,上课Choices.Choice不是它试图宣布的.相反,它试图宣布Choices.Choice.Choice,这将是一个不同的阶级.

有趣的是,这很好:

public class OuterClass
{
    public static class Inner1
    {
        public static class Inner2
        {
        }
    }

    public static class Inner2
    {
        public static class Inner1
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这被禁止了:

public class OuterClass
{
    public static class Inner1
    {
        public static class Inner2
        {
            public static class Inner1
            {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我猜这个规则是一个类的名称不能与任何级别的包含类相同.显然这里的修复已经知道 - 让JAXB不生成无效代码.

但我的问题是,为什么这个限制甚至存在?什么是Java编译器试图避免不让我们创建一个与包含类同名的内部类?

das*_*ght 6

Java允许您在不完全指定其名称的情况下引用外部类,如下所示:

public static class Inner1
{
    public static class Inner2
    {
        public static class Inner3
        {
            public void demo() {
                Class<Inner2> c = Inner2.class; // This is allowed
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果类的嵌套允许在任何层次结构中使用相同的名称,那么通过非限定名称引用将是不可能的.Java编译器试图通过禁止嵌套声明与其外部类的名称冲突来保留这种能力.