Java 不一致的类层次结构

Java 不一致的类层次结构,java,class,inheritance,Java,Class,Inheritance,我已经阅读了关于类构造函数的内容,然后出现了一个问题,即为什么以下层次结构不正确: public class Test extends Subclass.Inner{ //compile-time error //The hierarchy of the type Test is inconsistent public Test() { super(); } } public class Subclass

我已经阅读了关于类构造函数的内容,然后出现了一个问题,即为什么以下层次结构不正确:

public class Test extends Subclass.Inner{ //compile-time error 
                           //The hierarchy of the type Test is inconsistent
    public Test() {
        super();
    }
}


public class Subclass extends Test{
    public class Inner{
    }
}
正式地

如果超类构造函数调用语句是非限定的,并且 如果S是内部成员类,那么如果S是 不是通过声明或 继承

我认为这个例子完全符合我引用的规则。在这种情况下,
子类
通过继承在词汇上包含了
测试
的类。为什么代码不能正常工作?您能提供一个适当的例子来反映吗?

内部实例类(非静态)实际上是这样转换的:

public class Subclass extends Test {
    public class Inner {
    }
}
变成这样:

public class Subclass extends Test {

}

public class Inner {
    Subclass parent;
    public Inner(Subclass parent) {
        this.parent = parent;
    }
}
以下各项有效:

public class Container extends Subclass {
    public class Test extends Subclass.Inner {
        public Test() {
            super();
        }
    }
}

public class Subclass {
    public class Inner {
    }
}

内部类的实例必须具有封闭实例,该实例在内部类实例之前初始化。另一方面,超类构造函数总是在子类构造函数之前执行。因此,创建
子类
的实例需要首先调用
Test
的构造函数,这需要首先调用
子类.Inner
的构造函数,但是
子类.Inner
不能在其包含实例之前初始化


我相信为了满足你所引用的条件,超类内部必须包含一个超类的测试。在您的情况下,它包含在一个子类Test中。

这里有一个您缺少的子句():

如果在C的
扩展
实现
子句中将T作为超类或超接口、或作为超类或超接口名称的限定符,则类C直接依赖于类型T

如果满足以下任一条件,则C类取决于参考类型T:

  • C直接依赖于依赖于T的类D(递归使用此定义)。
如果类依赖于自身,则为编译时错误。

这是一个编译时错误,因为
子类
的超类声明包含
子类
作为超类名称的限定符

除此之外,这里还有一个非常奇怪的循环定义<代码>测试本身就是一个外部范围

这也不会编译,尽管它不像内部类那样令人费解:

class Test implements Test.ITest {
    interface ITest {}
}
Netbeans给了我一个更直接的错误,即存在“循环继承”。类声明不允许以这种方式引用自身