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