Sono a risolvere alcuni enigmi Java e ci siamo imbattuti su questo:JDK 1.7 vs JDK 1.6 classi interne differenza eredità
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
Durante la compilazione di questo codice con javac 1.6.0_45
sto ottenendo, come previsto, questo errore:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
Questo è causa di compilatore genera costruttore predefinito per Inner2
classe con codice simile, il che spiega l'errore sopra:
Inner2() {
this.super();
}
Ed è ovvio ora, perché davvero non si può fare questo in Java 1.6.0_45, JLS 8.8.7.1 (posso immaginare):
An explicit constructor invocation statement in a constructor body may not refer to any instance variables or instance methods declared in this class or any superclass, or use this or super in any expression; otherwise, a compile-time error occurs.
See (accepted answer in Odd situation for "cannot reference this before supertype constructor has been called")
Ma se provo a compilarlo con javac 1.7.0_79
- è OK!
E qui va la domanda - Che cosa è stato modificato in Java 1.7, che questo codice è ora corretto?
Grazie in anticipo!
@EJP hai controllato la [risposta accettata] (http://stackoverflow.com/a/3383555/365237) di quella, come quella che sembra rilevante – eis
@EJP, anche, 'this.super() 'è ** non ** equivalente a' super() '. Se provi a farlo in una classe non nidificata non interna, otterrai un errore in fase di compilazione, prima di [JLS1.6 8.8.7.1]. 'Se S non è una classe interna, o se la dichiarazione di S si verifica in un contesto statico, non esiste alcuna istanza di I che racchiude immediatamente rispetto a S. Si verifica un errore di compilazione se la chiamata del costruttore della superclasse è una chiamata del costruttore della superclasse qualificata. Simile a [JLS1.7 8.8.7.1]. – ar4ers