类层次结构不一致

时间:2014-11-16 07:31:07

标签: java class inheritance

我已经阅读了类构造函数here,然后出现了一个问题,为什么以下层次不正确:

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是,则编译时错误   通过声明或不是词汇封闭的C类成员   的 继承

我认为这个例子完全符合我引用的规则。在SubClass通过继承从词汇上隐含Test类的情况下。为什么代码不能正常工作?你能提供反映这一点的恰当例子吗?

3 个答案:

答案 0 :(得分:2)

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

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 {
    }
}

答案 1 :(得分:2)

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

我相信为了满足你所引用的条件,超类Inner必须被超类Test包围。在你的情况下,它被一个子类Test包围。

答案 2 :(得分:1)

这是您缺少的一个条款(8.4.1):

  

如果在C的extendsimplements子句中提到T作为超类或超接口,,则直接类C 依赖于类型T作为超类或超界面名称的限定符

     

如果满足以下任何条件,C类依赖于在引用类型T上:

     
      
  • C直接依赖于依赖于T的D类(递归使用此定义)。
  •   
     

如果某个类依赖于自身,那么这是一个编译时错误。

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

除了这里非常奇怪的循环定义之外。 Test将是其自身的外部范围。

这也不能编译,虽然它不像内部类那样令人费解:

class Test implements Test.ITest {
    interface ITest {}
}

Netbeans给了我一个更直接的错误,即存在'循环继承'。不允许类声明以这种方式引用自身。