即为什么下面的“循环依赖”是不可能的?
public class Something implements Behavior {
public interface Behavior {
// ...
}
}
由于接口不引用外部类,这应该是允许的;但是,编译器迫使我在类之外定义这些接口。这种行为有什么合乎逻辑的解释吗?
即为什么下面的“循环依赖”是不可能的?
public class Something implements Behavior {
public interface Behavior {
// ...
}
}
由于接口不引用外部类,这应该是允许的;但是,编译器迫使我在类之外定义这些接口。这种行为有什么合乎逻辑的解释吗?
规范中的相关规则:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4
如果在 C 的扩展或实现子句中提到 T 作为超类或超接口,或者作为超类或超接口名称的限定符,则类 C 直接依赖于类型 T。
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3
如果在 I 的扩展子句中将 T 作为超接口或作为超接口名称中的限定符提及,则接口 I 直接依赖于类型 T。
因此,如果A extends|implements B.C
, A 取决于C
和B
。然后,规范禁止循环依赖。
包含B
在依赖项中的动机尚不清楚。正如您所提到的,如果B.C
被提升到顶级C2
,就类型系统而言并没有太大的不同,那么为什么A extends C2
可以,但不行A extends B.C
呢?授予嵌套类型B.C
确实具有对 ' 内容的某些特权访问权限B
,但是我在规范中找不到任何A extends B.C
麻烦的东西。
唯一的问题是何时C
是内部类。假设B=A
,A extends A.C
应该被禁止,因为存在“封闭实例”的循环依赖。这可能是真正的动机——禁止外部类继承内部类。实际的规则更通用,因为它们更简单,而且即使对于非内部类也很有意义。
想象一下你是编译器。
我们说你要创建一个类Something。这个类实现了 Behavior... 但是 Behavior 还不存在,因为Something 尚未注册...
你明白这个问题吗?
将类视为包含事物的盒子。行为包含在“Something”框中。但是有些东西不存在。
语言规范禁止它的简单事实应该足够了。
我能想到的一些原因:
不会有用的。
无论出于何种原因,您可能想要使用它,我相信存在更好的选择。
子类应该扩展基类,那么为什么要在它自己的子类中声明一个基类呢?
让一个单独的类扩展你的内部类是违反直觉的。