编辑:人们似乎因为我的拼写错误和滥用术语而被抛弃了。我已经重写了解决这些问题的问题。请原谅任何进一步的错误。
我有一个通用类A
和两个扩展它的类,B
和C
。 A
,B
和C
分别具有嵌套类X
,Y
和Z
。 Y
和Z
都尝试在超类声明中仅使用简单类型名称来扩展X
。 B
和C
之间的唯一区别是B
扩展A<Object>
而C
扩展A<C.Z>
。出于某种原因,X
不在Z
声明的范围内:
class A<T> {
static class X {}
}
class B extends A<Object> {
static class Y extends X {} // okay
}
class C extends A<C.Z> {
static class Z extends X {} // error: X cannot be resolved to a type
}
这似乎与JLS中的范围规则相反:
在类类型C(第8.1.6节)中声明或继承的成员m的声明范围是C的整个主体,包括任何嵌套类型声明。
为什么X
在Z
的声明范围内不是Y
?这是在JLS中指定的吗?