Regression: accessing a private method through a type variable
Vicente Romero
vicente.romero at oracle.com
Tue Oct 24 17:24:35 UTC 2023
Hi Remi,
Thanks again for the report, we have already fixed it, see [1] for more
details,
Vicente
On 10/16/23 11:46, Vicente Romero wrote:
> Thanks for the report, we have created [1]. I'm taking a look at it,
>
> Vicente
>
> [1] https://bugs.openjdk.org/browse/JDK-8318160
>
> On 10/16/23 07:15, Maurizio Cimadamore wrote:
>>
>> I recall fixing this a long time ago:
>>
>>
>> https://bugs.openjdk.org/browse/JDK-6711619
>>
>>
>> Now, the test case mentioned in that bug is still correctly rejected
>> by javac. Furhermore, a similar test:
>>
>>
>> ```
>> class X<E extends X<E>> {
>> private static int m() { return 1; }
>> int f() {
>> return E.m();
>> }
>> }
>> ```
>>
>>
>> Also fails to compile with 21/22.
>>
>>
>> ```
>> Test.java:5: error: m() has private access in X
>> return E.m();
>> ^
>> 1 error
>>
>> ```
>>
>>
>> Trying to manipulate Remi's example, it seems the regression only has
>> to do with method refreences whose receiver is a type variable.
>>
>>
>> Here's a minimal reproducer:
>>
>>
>> ```
>> import java.util.function.*;
>>
>> class Test {
>> private String asString() {
>> return "bar";
>> }
>>
>> static <T extends Test> Function<T, String> foo() {
>> return T::asString;
>> }
>> }
>> ```
>>
>> I filed a bug:
>>
>>
>> https://bugs.openjdk.org/browse/JDK-6711619
>>
>>
>> Thanks
>> Maurizio
>>
>>
>> On 16/10/2023 10:40, Sundararajan Athijegannathan wrote:
>>> fwiw, this compile from at least JDK 11 onwards:
>>>
>>> import java.util.*;
>>> import java.util.stream.*;
>>>
>>> public class TDotToString {
>>> class Bar {
>>> private String asString() {
>>> return "bar";
>>> }
>>> }
>>>
>>> static <T extends Bar> String foo(List<T> list) {
>>> return list.stream().map(T::asString).collect(Collectors.joining());
>>> }
>>> }
>>>
>>> javac from 1.8.0 does issue error as mentioned by Remi.
>>>
>>>
>>> -Sundar
>>> ------------------------------------------------------------------------
>>> *From:* compiler-dev <compiler-dev-retn at openjdk.org> on behalf of
>>> Remi Forax <forax at univ-mlv.fr>
>>> *Sent:* 16 October 2023 13:57
>>> *To:* compiler-dev <compiler-dev at openjdk.org>
>>> *Subject:* Regression: accessing a private method through a type
>>> variable
>>> Hello,
>>> There is a regression in recent versions of javac.
>>> javac 21 allows to access a private method through a type variable,
>>> here T::asString.
>>>
>>> public class TDotToString {
>>> class Bar() {
>>> private String asString() {
>>> return "bar";
>>> }
>>> }
>>>
>>> static <T extends Bar> String foo(List<T> list) {
>>> return list.stream().map(T::asString).collect(Collectors.joining());
>>> }
>>> }
>>>
>>> Both IntelliJ and Eclipse emit an error in this case.
>>>
>>> And javac 8 emits
>>> TDotToString.java:12: error: invalid method reference
>>> return list.stream().map(T::asString).collect(Collectors.joining());
>>> ^
>>> cannot find symbol
>>> symbol: method asString()
>>> location: bound of type variable T
>>> where T is a type-variable:
>>> T extends TDotToString.Bar declared in method <T>foo(List<T>)
>>> 1 error
>>>
>>> regards,
>>> Rémi
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20231024/72dc6b62/attachment-0001.htm>
More information about the compiler-dev
mailing list