我已经阅读了类构造函数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
类的情况下。为什么代码不能正常工作?你能提供反映这一点的恰当例子吗?
答案 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的
extends
或implements
子句中提到T作为超类或超接口,或,则直接类C 依赖于类型T作为超类或超界面名称的限定符。如果满足以下任何条件,C类依赖于在引用类型T上:
- C直接依赖于依赖于T的D类(递归使用此定义)。
如果某个类依赖于自身,那么这是一个编译时错误。
这是一个编译时错误,因为Subclass
的超类的声明包含Subclass
作为超类名称的限定符。
除了这里非常奇怪的循环定义之外。 Test
将是其自身的外部范围。
这也不能编译,虽然它不像内部类那样令人费解:
class Test implements Test.ITest {
interface ITest {}
}
Netbeans给了我一个更直接的错误,即存在'循环继承'。不允许类声明以这种方式引用自身。