<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p>I recall fixing this a long time ago:</p>
    <p><br>
    </p>
    <p><a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-6711619">https://bugs.openjdk.org/browse/JDK-6711619</a></p>
    <p><br>
    </p>
    <p>Now, the test case mentioned in that bug is still correctly
      rejected by javac. Furhermore, a similar test:</p>
    <p><br>
      ```<br>
      class X<E extends X<E>> {<br>
                   private static int m() { return 1; }<br>
                   int f() {<br>
                           return E.m();<br>
                   }<br>
          }<br>
      ```<br>
    </p>
    <p><br>
    </p>
    <p>Also fails to compile with 21/22.</p>
    <p><br>
    </p>
    ```<br>
    Test.java:5: error: m() has private access in X<br>
                         return E.m();<br>
                                 ^<br>
    1 error<br>
    <p>```</p>
    <p><br>
    </p>
    <p>Trying to manipulate Remi's example, it seems the regression only
      has to do with method refreences whose receiver is a type
      variable.<br>
    </p>
    <p><br>
    </p>
    <p>Here's a minimal reproducer:</p>
    <p><br>
    </p>
    <p>```<br>
      import java.util.function.*;<br>
      <br>
      class Test {<br>
        private String asString() {<br>
          return "bar";<br>
        }<br>
      <br>
        static <T extends Test> Function<T, String> foo() {<br>
          return T::asString;<br>
        }<br>
      }<br>
      ```</p>
    <p>I filed a bug:</p>
    <p><br>
    </p>
    <p><a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-6711619">https://bugs.openjdk.org/browse/JDK-6711619</a></p>
    <p><br>
    </p>
    <p>Thanks<br>
      Maurizio<br>
    </p>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 16/10/2023 10:40, Sundararajan
      Athijegannathan wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:DM6PR10MB29541241C314FCEEA2C7B32FEAD7A@DM6PR10MB2954.namprd10.prod.outlook.com">
      
      <style type="text/css" style="display:none;">P {margin-top:0;margin-bottom:0;}</style>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
        fwiw, this compile from at least JDK 11 onwards:</div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
        <br>
      </div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
        import java.util.*;
        <div class="ContentPasted0">import java.util.stream.*;</div>
        <div><br class="ContentPasted0">
        </div>
        <div class="ContentPasted0">public class TDotToString {</div>
        <div class="ContentPasted0">  class Bar {</div>
        <div class="ContentPasted0">    private String asString() {</div>
        <div class="ContentPasted0">      return "bar";</div>
        <div class="ContentPasted0">    }</div>
        <div class="ContentPasted0">  }</div>
        <div><br class="ContentPasted0">
        </div>
        <div class="ContentPasted0">  static <T extends Bar>
          String foo(List<T> list) {</div>
        <div class="ContentPasted0">    return
          list.stream().map(T::asString).collect(Collectors.joining());</div>
        <div class="ContentPasted0">  }</div>
        }<br>
      </div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
        <br>
      </div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
        javac from 1.8.0 does issue error as mentioned by Remi.</div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
        <br>
      </div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
        <br>
      </div>
      <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0">
        -Sundar</div>
      <hr style="display:inline-block;width:98%" tabindex="-1">
      <div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b>
          compiler-dev <a class="moz-txt-link-rfc2396E" href="mailto:compiler-dev-retn@openjdk.org"><compiler-dev-retn@openjdk.org></a> on behalf
          of Remi Forax <a class="moz-txt-link-rfc2396E" href="mailto:forax@univ-mlv.fr"><forax@univ-mlv.fr></a><br>
          <b>Sent:</b> 16 October 2023 13:57<br>
          <b>To:</b> compiler-dev <a class="moz-txt-link-rfc2396E" href="mailto:compiler-dev@openjdk.org"><compiler-dev@openjdk.org></a><br>
          <b>Subject:</b> Regression: accessing a private method through
          a type variable</font>
        <div> </div>
      </div>
      <div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
            <div class="PlainText">Hello,<br>
              There is a regression in recent versions of javac.<br>
              javac 21 allows to access a private method through a type
              variable, here T::asString.<br>
              <br>
              public class TDotToString {<br>
                class Bar() {<br>
                  private String asString() {<br>
                    return "bar";<br>
                  }<br>
                }<br>
              <br>
                static <T extends Bar> String foo(List<T>
              list) {<br>
                  return
              list.stream().map(T::asString).collect(Collectors.joining());<br>
                }<br>
              }<br>
              <br>
              Both IntelliJ and Eclipse emit an error in this case.<br>
              <br>
              And javac 8 emits<br>
                TDotToString.java:12: error: invalid method reference<br>
                  return
              list.stream().map(T::asString).collect(Collectors.joining());<br>
                                           ^<br>
                cannot find symbol<br>
                  symbol:   method asString()<br>
                  location: bound of type variable T<br>
                where T is a type-variable:<br>
                  T extends TDotToString.Bar declared in method
              <T>foo(List<T>)<br>
              1 error<br>
              <br>
              regards,<br>
              RĂ©mi<br>
            </div>
          </span></font></div>
    </blockquote>
  </body>
</html>