<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
Thanks for the report, we have created [1]. I'm taking a look at it,<br>
<br>
Vicente<br>
<br>
[1] <span style="font-family:"Aptos",sans-serif"><a href="https://bugs.openjdk.org/browse/JDK-8318160" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8318160</a></span><br>
<br>
<div class="moz-cite-prefix">On 10/16/23 07:15, Maurizio Cimadamore
wrote:<br>
</div>
<blockquote type="cite" cite="mid:c1fbee53-765a-441e-92b3-d39b5709cb06@oracle.com">
<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" moz-do-not-send="true">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" moz-do-not-send="true">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" moz-do-not-send="true"><compiler-dev-retn@openjdk.org></a>
on behalf of Remi Forax <a class="moz-txt-link-rfc2396E" href="mailto:forax@univ-mlv.fr" moz-do-not-send="true"><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" moz-do-not-send="true"><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>
</blockquote>
<br>
</body>
</html>