RFR: 8029633: Raw inner class constructor ref should not perform diamond inference

Vicente Romero vromero at openjdk.org
Fri Aug 5 20:31:36 UTC 2022


On Fri, 5 Aug 2022 20:20:14 GMT, Vicente Romero <vromero at openjdk.org> wrote:

> This PR is synchronizing the compiler with the spec, in particular with this portion of section `15.13.1 Compile-Time Declaration of a Method Reference`:
> 
> 
> – If the method reference expression has the form ClassType ::
>   [TypeArguments] new , then the potentially applicable methods are a set of
>   notional methods corresponding to the constructors of ClassType.
>   If ClassType is a raw type, but is not a non- static member type of a raw type,
>   the candidate notional member methods are those specified in §15.9.3 for a
>   class instance creation expression that uses <> to elide the type arguments to a
>   class. Otherwise, the candidate notional member methods are the constructors
>   of ClassType, treated as if they were methods with return type ClassType.
> 
> so javac should treat the code below as a raw constructor invocation:
> 
> 
> class Outer<T> {
>     class Inner<U> {}
> 
>     Supplier<Outer<T>.Inner<String>> s = Outer.Inner::new;
> }
> 
> currently javac is rejecting this code

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java line 3691:

> 3689:                 this.site = new ClassType(site.getEnclosingType(),
> 3690:                         !site.tsym.isInner() ? site.tsym.type.getTypeArguments() : List.nil(), site.tsym, site.getMetadata());
> 3691:                 needsInference = true;

Note: so here it seems like we are still doing diamond inference but check that we are creating a new class type with no arguments so no inference will be done in this case (site is an inner class), but we are still setting `needsInference` to true in order to reuse the code in `Resolve::findDiamond` that creates a new `MethodSymbol` for the constructor with the right result type instead of `void`

-------------

PR: https://git.openjdk.org/jdk/pull/9784


More information about the compiler-dev mailing list