RFR: 8365676: javac incorrectly allows calling interface static method via type variable
Maurizio Cimadamore
mcimadamore at openjdk.org
Wed Sep 3 09:49:47 UTC 2025
On Sat, 30 Aug 2025 00:37:44 GMT, Chen Liang <liach at openjdk.org> wrote:
> The interface static methods added in Java 8 are never inherited in method resolution. However, javac incorrectly allowed them to be resolved against type variables with an interface as its only upper bound, which violates JLS 4.9:
>
>> The members of an intersection type are the members of the class or interface it induces.
>
> Combined with JLS 4.4:
>
>> The members of a type variable X with bound T & I1 & ... & In are the members of the intersection type ([§4.9](https://docs.oracle.com/javase/specs/jls/se24/html/jls-4.html#jls-4.9)) T & I1 & ... & In appearing at the point where the type variable is declared
>
> Last time this piece of code in Attr was updated was around Java 7, so this was probably missed in Java 8.
>
> The test cases added showcases wrong ways to refer to interface static methods: `Collator`, a subtype of `Comparator`, cannot use `reverseOrder`, so shouldn't type variable `T` bounded by `Comparator<Integer>` be able to do so.
>
> In addition, the error for private member access on type variables should probably have been symbol not found instead of access errors - we might revisit that later. I made the new error symbol not found for parity with interface static reference on classes, as showcased in the compiler output in this new test.
src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 4577:
> 4575: // 1. Private members
> 4576: // 2. Interface static methods
> 4577: Symbol sym2 = sym.isPrivate()
Code is good, but please break up the big conditional
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27015#discussion_r2318416548
More information about the compiler-dev
mailing list