Почему изменение параметра типа этого класса влияет на область действия наследуемого вложенного класса?
Редактировать: люди, кажется, были сбиты с толку моими опечатками и неправильным использованием терминологии. Я переписал вопрос для решения этих проблем. Пожалуйста, прости любые дальнейшие ошибки.
У меня есть общий класс 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:
Область объявления члена m, объявленного или унаследованного типом класса C (§8.1.6), является всем телом C, включая любые вложенные объявления типов.
Почему нет X
в рамках декларации Z
когда это для Y
? Это указано в JLS?