Ваш код компилируется под Java 7.
Следующий обходной путь компилируется под Java 6.
public class C extends B
{
public C()
{
A.this.super();
}
}
@ Ссылка Саугока на предыдущий вопрос цитирует объяснение Джошуа. В основном он утверждал, что, поскольку C является подклассом A, C наследует членов A как членов C. Следовательно, B также является членом C. (Например, допустим литерал класса C.B.class
.) Поэтому он утверждает, что C.this
является включающим экземпляром для B's super()
, поэтому C(){super();}
на самом деле C(){C.this.super();}
. Так как C.this
не может быть оценен перед супер-конструктором, то это ошибка.
Однако, похоже, это не гарантируется языковой спецификацией. Смотрите # 8.1.3. Поскольку B
не является немедленно лексическим , заключенным в C
, B
не является прямым внутренним классом C
, нет никаких оснований утверждать, что прямой экземпляр B
должен быть экземпляром C
.
Нам нужно передать B()
экземпляр A
. Это правда, что C.this
является экземпляром A
(попробуйте этот код: new C().new B().new C().new B();
), поэтому он может быть кандидатом. Есть еще один кандидат, A.this
. A.this
доступен и готов к использованию (он передается в качестве скрытого параметра в C()
).
Согласно javap
, javac 7 компилирует код в
class B
private A this$0;
B( A a )
this$0 = a;
super(); // A()
class C extends B
private A this$0;
C( A a )
this$0 = a;
super( a ); // B(A)