JLS , раздел 8.8.7.1 , управляет спецификациями для явных вызовов конструктора. В грамматике можно указать this.super()
.
Первичный . [TypeArguments] super
( [ArgumentList] );
А «Первичное» выражение может быть this
. Следовательно, this.super()
является допустимым выражением в соответствии с грамматикой языка Java, но этого недостаточно. Это не разрешено согласно семантике такого выражения.
Квалифицированные вызовы конструктора суперкласса начинаются с Первичного выражения или ExpressionName . Они позволяют конструктору подкласса явным образом указывать экземпляр объекта, который немедленно создается, в отношении прямого суперкласса (§8.1.3). Это может быть необходимо, когда суперкласс является внутренним классом.
Семантика указывает, что здесь this
пытается указать включающий экземпляр, а не текущий экземпляр объекта. Ошибка компилятора, которую вы получаете, не самая очевидная, но здесь this
пытается сослаться на включающий класс суперкласса, но Object
не имеет включающего класса.
public class J {
public J() {
this.super();
}
}
J.java:17: error: illegal qualifier; Object is not an inner class
this.super();
^
1 error
Попробуем использовать this
в качестве включающего экземпляра. Класс J
имеет внутренний класс K
, и Foo
пытается создать подкласс J.K
.
class J {
public J() { }
public class K {}
}
class Foo extends J.K {
public Foo() {
this.super();
}
}
Теперь ошибка:
J.java:21: error: cannot reference this before supertype constructor has been called
this.super();
^
1 error
Я могу заставить его работать только с основным выражением, отличным от this
.
class Foo extends J.K {
public Foo() {
new J().super();
}
}
Ошибка семантики, а не грамматическая ошибка, не позволяет использовать this.super()
.