<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="markdown-here-wrapper" data-md-url="" style="">
      <p style="margin: 0px 0px 1.2em !important;">Hi,<br>
        I’m not sure whether the error you get is legit or not, but I
        observe that it’s not just about sealed classes - e.g. something
        like</p>
      <p style="margin: 0px 0px 1.2em !important;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">class Tmp<X extends Tmp.A></code></p>
      <p style="margin: 0px 0px 1.2em !important;">results in the same
        behavior.</p>
      <p style="margin: 0px 0px 1.2em !important;">I think this is due
        to JLS 6.3:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite">
          <p class="norm-static"> The scope of a declaration of a member
            <code class="varname">m</code> declared in or inherited by a
            class or interface <span class="type">C</span> (<a class="xref" href="https://docs.oracle.com/javase/specs/jls/se22/html/jls-8.html#jls-8.2" title="8.2. Class Members">§8.2</a>, <a class="xref" href="https://docs.oracle.com/javase/specs/jls/se22/html/jls-9.html#jls-9.2" title="9.2. Interface Members">§9.2</a>) is the entire
            body of <span class="type">C</span>, including any nested
            class or interface declarations. If <span class="type">C</span>
            is a record class, then the scope of <code class="varname">m</code>
            additionally includes the header of the record declaration
            of <span class="type">C</span>. </p>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <p style="margin: 0px 0px 1.2em !important;">That is, an “extends”
        or “permits” clause is not really type-checked as if inside the
        body of class C. This results in the accessibility problem you
        point out (which might or might not be a compiler glitch, I
        don’t think the JLS is crystal clear on how Tmp.A should be
        checked).</p>
      <p style="margin: 0px 0px 1.2em !important;">That said… back to
        your immediate problem - whenever you have nested classes
        extending from a toplevel class, you can just omit “permits” and
        leave it to javac, like so:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code class="hljs language-java" style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); background: rgb(248, 248, 248); -moz-text-size-adjust: none;">sealed <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Tmp</span> </span>{
     <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">private</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">static</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">final</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">class</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">A</span> <span class="hljs-keyword" style="color: rgb(51, 51, 51); font-weight: bold;">extends</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;color: rgb(68, 85, 136); font-weight: bold;">Tmp</span> </span>{ ... } <span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// ok</span>
}
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">This should allow
        what you want to do.</p>
      <p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
      <p style="margin: 0px 0px 1.2em !important;">On 26/08/2024 13:28,
        Olexandr Rotan wrote:</p>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div class="markdown-here-exclude">
        <p></p>
        <blockquote type="cite" cite="mid:CAL5bRt9OwRct5UFsT+QATX0MPL4FB=Xohowe1a-pJtf09bm56w@mail.gmail.com">
          
          <div dir="ltr">Hello. Recently, I have started a new project
            to explore Babylon code reflection API (LInq), and thought
            that using sealed classes to represent operand type would be
            really suitable (function calls, column refs etc.). However,
            I want to only expose one interface/abstract class for each
            of those types, while actual implementations are private
            classes inside sealed classes. However, when I tried to
            compile something like this (simplified for brevity):
            <div><br>
            </div>
            <div>
              <pre style="color:rgb(188,190,196);font-family:"JetBrains Mono",monospace"><span style="color:rgb(207,142,109)">sealed class </span>Tmp <span style="color:rgb(207,142,109)">permits </span>Tmp.A {
    
    <span style="color:rgb(207,142,109)">private static final class </span>A <span style="color:rgb(207,142,109)">extends </span>Tmp {
    }
}</pre>
              <pre style="color:rgb(188,190,196);font-family:"JetBrains Mono",monospace">
</pre>
              <pre style=""><span style="background-color:rgb(243,243,243)"><font style="" face="arial, sans-serif" color="#000000">I got following error:</font></span></pre>
              <pre style="">error: A has private access in Tmp</pre>
              <pre style="">
</pre>
              <pre style=""><font face="arial, sans-serif">Is this behaviour expected or not? 
(I would assume second since intellij code analysis didn't mark this as error)

If it's later, I would ask some JDK member to file a bug report (I noticed that they 
are processed faster then non-member requests), and I will try to fix this. If it`s 
premier, then what is the motivation behind this?</font></pre>
              <pre style=""><span style="background-color:rgb(243,243,243)">
</span></pre>
            </div>
          </div>
        </blockquote>
        <p></p>
      </div>
      <p style="margin: 0px 0px 1.2em !important;"></p>
      <div title="MDH:PHA+SGksPGJyPkknbSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBlcnJvciB5b3UgZ2V0IGlzIGxlZ2l0
IG9yIG5vdCwgYnV0IEkgb2JzZXJ2ZSB0aGF0IGl0J3Mgbm90IGp1c3QgYWJvdXQgc2VhbGVkIGNs
YXNzZXMgLSBlLmcuIHNvbWV0aGluZyBsaWtlPC9wPjxwPmBjbGFzcyBUbXAmbHQ7WCBleHRlbmRz
IFRtcC5BJmd0O2A8L3A+PHA+cmVzdWx0cyBpbiB0aGUgc2FtZSBiZWhhdmlvci48L3A+PHA+SSB0
aGluayB0aGlzIGlzIGR1ZSB0byBKTFMgNi4zOjwvcD48cD48YmxvY2txdW90ZSB0eXBlPSJjaXRl
Ij48cCBjbGFzcz0ibm9ybS1zdGF0aWMiPgogICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgYSBk
ZWNsYXJhdGlvbiBvZiBhIG1lbWJlciA8Y29kZSBjbGFzcz0idmFybmFtZSI+bTwvY29kZT4gZGVj
bGFyZWQgaW4gb3IgaW5oZXJpdGVkIGJ5CiAgICAgICAgICAgICAgIGEgY2xhc3Mgb3IgaW50ZXJm
YWNlIDxzcGFuIGNsYXNzPSJ0eXBlIj5DPC9zcGFuPiAoPGEgY2xhc3M9InhyZWYiIGhyZWY9Imh0
dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UyMi9odG1sL2pscy04Lmh0
bWwjamxzLTguMiIgdGl0bGU9IjguMi4mbmJzcDtDbGFzcyBNZW1iZXJzIj7CpzguMjwvYT4sIDxh
IGNsYXNzPSJ4cmVmIiBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3Mv
amxzL3NlMjIvaHRtbC9qbHMtOS5odG1sI2pscy05LjIiIHRpdGxlPSI5LjIuJm5ic3A7SW50ZXJm
YWNlIE1lbWJlcnMiPsKnOS4yPC9hPikgaXMgdGhlIGVudGlyZSBib2R5IG9mIDxzcGFuIGNsYXNz
PSJ0eXBlIj5DPC9zcGFuPiwgaW5jbHVkaW5nIGFueSBuZXN0ZWQKICAgICAgICAgICAgICAgY2xh
c3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucy4gSWYgPHNwYW4gY2xhc3M9InR5cGUiPkM8L3Nw
YW4+IGlzIGEgcmVjb3JkIGNsYXNzLCB0aGVuIHRoZSAKICAgICAgICAgICAgICAgc2NvcGUgb2Yg
PGNvZGUgY2xhc3M9InZhcm5hbWUiPm08L2NvZGU+IGFkZGl0aW9uYWxseSBpbmNsdWRlcyB0aGUg
aGVhZGVyIG9mIHRoZSByZWNvcmQgCiAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uIG9mIDxzcGFu
IGNsYXNzPSJ0eXBlIj5DPC9zcGFuPi4KICAgICAgICAgICAgPC9wPjwvYmxvY2txdW90ZT48L3A+
PHA+VGhhdCBpcywgYW4gImV4dGVuZHMiIG9yICJwZXJtaXRzIiBjbGF1c2UgaXMgbm90IHJlYWxs
eSB0eXBlLWNoZWNrZWQgYXMgaWYgaW5zaWRlIHRoZSBib2R5IG9mIGNsYXNzIEMuIFRoaXMgcmVz
dWx0cyBpbiB0aGUgYWNjZXNzaWJpbGl0eSBwcm9ibGVtIHlvdSBwb2ludCBvdXQgKHdoaWNoIG1p
Z2h0IG9yIG1pZ2h0IG5vdCBiZSBhIGNvbXBpbGVyIGdsaXRjaCwgSSBkb24ndCB0aGluayB0aGUg
SkxTIGlzIGNyeXN0YWwgY2xlYXIgb24gaG93IFRtcC5BIHNob3VsZCBiZSBjaGVja2VkKS48L3A+
PHA+VGhhdCBzYWlkLi4uIGJhY2sgdG8geW91ciBpbW1lZGlhdGUgcHJvYmxlbSAtIHdoZW5ldmVy
IHlvdSBoYXZlIG5lc3RlZCBjbGFzc2VzIGV4dGVuZGluZyBmcm9tIGEgdG9wbGV2ZWwgY2xhc3Ms
IHlvdSBjYW4ganVzdCBvbWl0ICJwZXJtaXRzIiBhbmQgbGVhdmUgaXQgdG8gamF2YWMsIGxpa2Ug
c286PC9wPjxwPmBgYGphdmE8YnI+c2VhbGVkIGNsYXNzIFRtcCB7PGJyPiZuYnNwOyZuYnNwOyZu
YnNwOyZuYnNwOyBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBIGV4dGVuZHMgVG1wIHsgLi4u
IH0gLy8gb2s8YnI+fTxicj5gYGA8L3A+PHA+VGhpcyBzaG91bGQgYWxsb3cgd2hhdCB5b3Ugd2Fu
dCB0byBkby48L3A+PHA+TWF1cml6aW88YnI+PC9wPjxwPjxicj48L3A+PGRpdiBjbGFzcz0ibW96
LWNpdGUtcHJlZml4Ij5PbiAyNi8wOC8yMDI0IDEzOjI4LCBPbGV4YW5kciBSb3RhbiB3cm90ZTo8
YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOkNBTDViUnQ5T3dSY3Q1
VUZzVCtRQVRYME1QTDRGQj1Yb2hvd2UxYS1wSnRmMDlibTU2d0BtYWlsLmdtYWlsLmNvbSI+PG1l
dGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7ICI+PGRpdiBk
aXI9Imx0ciI+SGVsbG8uIFJlY2VudGx5LCBJIGhhdmUgc3RhcnRlZCBhIG5ldyBwcm9qZWN0IHRv
IGV4cGxvcmUgQmFieWxvbiBjb2RlIHJlZmxlY3Rpb24gQVBJIChMSW5xKSwgYW5kIHRob3VnaHQg
dGhhdCB1c2luZyBzZWFsZWQgY2xhc3NlcyB0byByZXByZXNlbnQgb3BlcmFuZCB0eXBlIHdvdWxk
Jm5ic3A7YmUgcmVhbGx5IHN1aXRhYmxlIChmdW5jdGlvbiBjYWxscywgY29sdW1uIHJlZnMgZXRj
LikuIEhvd2V2ZXIsIEkgd2FudCB0byBvbmx5IGV4cG9zZSBvbmUgaW50ZXJmYWNlL2Fic3RyYWN0
IGNsYXNzIGZvciBlYWNoIG9mIHRob3NlIHR5cGVzLCB3aGlsZSBhY3R1YWwgaW1wbGVtZW50YXRp
b25zIGFyZSBwcml2YXRlIGNsYXNzZXMgaW5zaWRlIHNlYWxlZCBjbGFzc2VzLiBIb3dldmVyLCB3
aGVuIEkgdHJpZWQgdG8gY29tcGlsZSBzb21ldGhpbmcgbGlrZSB0aGlzIChzaW1wbGlmaWVkIGZv
ciBicmV2aXR5KTo8ZGl2Pjxicj48L2Rpdj48ZGl2PjxwcmUgc3R5bGU9ImNvbG9yOnJnYigxODgs
MTkwLDE5Nik7Zm9udC1mYW1pbHk6JnF1b3Q7SmV0QnJhaW5zIE1vbm8mcXVvdDssbW9ub3NwYWNl
Ij48c3BhbiBzdHlsZT0iY29sb3I6cmdiKDIwNywxNDIsMTA5KSI+c2VhbGVkIGNsYXNzIDwvc3Bh
bj5UbXAgPHNwYW4gc3R5bGU9ImNvbG9yOnJnYigyMDcsMTQyLDEwOSkiPnBlcm1pdHMgPC9zcGFu
PlRtcC5BIHs8YnI+ICAgIDxicj4gICAgPHNwYW4gc3R5bGU9ImNvbG9yOnJnYigyMDcsMTQyLDEw
OSkiPnByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIDwvc3Bhbj5BIDxzcGFuIHN0eWxlPSJjb2xv
cjpyZ2IoMjA3LDE0MiwxMDkpIj5leHRlbmRzIDwvc3Bhbj5UbXAgezxicj4gICAgfTxicj59PC9w
cmU+PHByZSBzdHlsZT0iY29sb3I6cmdiKDE4OCwxOTAsMTk2KTtmb250LWZhbWlseTomcXVvdDtK
ZXRCcmFpbnMgTW9ubyZxdW90Oyxtb25vc3BhY2UiPjxicj48L3ByZT48cHJlIHN0eWxlPSIiPjxz
cGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJnYigyNDMsMjQzLDI0MykiPjxmb250IHN0eWxl
PSIiIGZhY2U9ImFyaWFsLCBzYW5zLXNlcmlmIiBjb2xvcj0iIzAwMDAwMCI+SSBnb3QgZm9sbG93
aW5nIGVycm9yOjwvZm9udD48L3NwYW4+PC9wcmU+PHByZSBzdHlsZT0iIj5lcnJvcjogQSBoYXMg
cHJpdmF0ZSBhY2Nlc3MgaW4gVG1wPC9wcmU+PHByZSBzdHlsZT0iIj48YnI+PC9wcmU+PHByZSBz
dHlsZT0iIj48Zm9udCBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+SXMgdGhpcyBiZWhhdmlvdXIg
ZXhwZWN0ZWQgb3Igbm90PyAKKEkgd291bGQgYXNzdW1lIHNlY29uZCBzaW5jZSBpbnRlbGxpaiBj
b2RlIGFuYWx5c2lzIGRpZG4ndCBtYXJrIHRoaXMgYXMgZXJyb3IpCgpJZiBpdCdzIGxhdGVyLCBJ
IHdvdWxkIGFzayBzb21lIEpESyBtZW1iZXIgdG8gZmlsZSBhIGJ1ZyByZXBvcnQgKEkgbm90aWNl
ZCB0aGF0IHRoZXkgCmFyZSBwcm9jZXNzZWQgZmFzdGVyIHRoZW4gbm9uLW1lbWJlciByZXF1ZXN0
cyksIGFuZCBJIHdpbGwgdHJ5IHRvIGZpeCB0aGlzLiBJZiBpdGBzIApwcmVtaWVyLCB0aGVuIHdo
YXQgaXMgdGhlIG1vdGl2YXRpb24gYmVoaW5kIHRoaXM/PC9mb250PjwvcHJlPjxwcmUgc3R5bGU9
IiI+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmdiKDI0MywyNDMsMjQzKSI+Cjwvc3Bh
bj48L3ByZT48L2Rpdj48L2Rpdj4KCjwvYmxvY2txdW90ZT4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>