<div dir="ltr"><div dir="ltr">Hi Stephan,<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 29, 2024 at 9:11 AM Stephan Herrmann <<a href="mailto:stephan.herrmann@berlin.de">stephan.herrmann@berlin.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Am 29.10.24 um 14:11 schrieb Olexandr Rotan:<br>
> Local classes, as well as inner ones (don't confuse with nested) implicitly take <br>
> parents "this" as a constructor argument<br>
<br>
They *may* take this argument *if needed*.<br>
<br>
But this is more an implementation detail and not the level at which the <br>
specification defines this, is it?<br></blockquote><div><br></div><div>This is a specification thing.</div><div><br></div>Here is what is "supposed" to happen: Both "Local" classes in the example are declared prior to super(). These classes are therefore within an early construction context of "Inner" and therefore do not have access to the current instance of "Inner" - but this access would be required for the expression "s" which is short-hand for "Inner.this.s".</div><div class="gmail_quote"><br></div><div class="gmail_quote">So the reference to "s" should generate an error, which happens with the current 24 build:<br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><span style="font-family:monospace">    X.java:14: error: cannot reference s before supertype constructor has been called<br>                                                System.out.println(s);<br>                                                                   ^<br></span></div><div><br></div><div>FYI there is still an <a href="https://github.com/openjdk/jdk/pull/21410">outstanding bug and associated PR</a> related to this situation, so with the current 24 build you also get these (bogus) errors:</div><div><br></div><div><span style="font-family:monospace">    X.java:7: error: cannot reference this before supertype constructor has been called<br>                                new Local() {};<br>                                            ^<br>    X.java:12: error: cannot reference this before supertype constructor has been called<br>                                new Local() {<br>                                            ^</span></div><div><br></div><div>Those errors are bogus, because under the latest "flexible constructors" spec, local classes declared in an early construction context of class C are treated the same as anonymous classes in that situation - they do not have any outer instance of type C - so you can declare and instantiate them freely.<br></div><div><br></div><div>-Archie<br></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature">Archie L. Cobbs<br></div></div>