<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<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>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> compiler-dev <compiler-dev-retn@openjdk.org> on behalf of Remi Forax <forax@univ-mlv.fr><br>
<b>Sent:</b> 16 October 2023 13:57<br>
<b>To:</b> compiler-dev <compiler-dev@openjdk.org><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>
</body>
</html>