Change in type inference behaviour with JDK-8078024

Vicente-Arturo Romero-Zaldivar vicente.romero at oracle.com
Wed Jul 8 20:39:17 UTC 2015


On 07/08/2015 01:16 PM, Liam Miller-Cushon wrote:
> Thanks for investigating, and for the detailed explanation. I'm glad 
> to hear that the new behaviour is valid.
>
> Is it worth adding a regression test for this?

Yes it is. I will create a bug report for it.

Thanks,
Vicente

>
> On Tue, Jul 7, 2015 at 7:02 PM, Vicente-Arturo Romero-Zaldivar 
> <vicente.romero at oracle.com <mailto:vicente.romero at oracle.com>> wrote:
>
>     Hi,
>
>     I have modified the test case to:
>
>     import java.util.Arrays;
>     import java.util.List;
>
>     class K {
>       public static <A> List<List<A>> cartesianProduct(List<? extends
>     A>... lists) {
>         return cartesianProduct(Arrays.asList(lists));
>       }
>
>       public static <B> List<List<B>> cartesianProduct(List<? extends
>     List<? extends B>> lists) {
>         throw new AssertionError();
>       }
>     }
>
>     In order to have different names for each type variable, now A and B.
>
>     This corner case shows a semantic change of the patch for
>     JDK-8078024. While determining the applicability of method:
>
>     <B> List<List<B>> cartesianProduct(List<? extends List<? extends
>     B>> lists)
>
>     For which we have the constraints:
>
>     B <: Object
>     T <: List<? extends B>
>     T<: Object
>     List<? extends A> <: T
>
>     First, variable B is selected for instantiation:
>
>     B = CAP1 of ? extends A
>     so this implies that:
>
>     T <: List<? extends CAP1 of ? extends A>
>     T<: Object
>     List<? extends A> <: T
>
>     OK now all the bounds are checked for consistency. While checking
>     if List<? extends A> is a subtype of List<? extends CAP1 of ?
>     extends A> a bound error is reported. Before the compiler was just
>     swallowing it. As now the error is reported while variable B is
>     being instantiated, the bound set is rolled back to it's initial
>     state, B is instantiated to Object, and with this instantiation
>     the constraint set is solvable, the method is applicable, it's the
>     only applicable one and the code is accepted as correct.
>
>
>     Thanks,
>     Vicente
>
>
>
>
>     On 07/07/2015 04:58 PM, Maurizio Cimadamore wrote:
>>     My understanding is that 8078024 should have been mostly a
>>     cleanup with performance-related issues (i.e. less time to
>>     converge to a non-existent solution). But Vicente did the work
>>     and might know few things more about this one, so let's hear from
>>     him.
>>
>>     Maurizio
>>
>>     On 07/07/15 22:34, Liam Miller-Cushon wrote:
>>>     The fix for JDK-8078024 resolved an issue with type inference I
>>>     was seeing with javac9. I can't tell from the bug report if that
>>>     was deliberate.
>>>
>>>     Could someone please confirm that the current behaviour is correct?
>>>
>>>     Here's the repro. It fails with jdk9-dev @2888, and compiles
>>>     cleanly @2889:
>>>
>>>     === A.java ===
>>>     import java.util.Arrays;
>>>     import java.util.List;
>>>
>>>     class A {
>>>       public static <B> List<List<B>> cartesianProduct(List<?
>>>     extends B>... lists) {
>>>         return cartesianProduct(Arrays.asList(lists));
>>>       }
>>>
>>>       public static <B> List<List<B>> cartesianProduct(List<?
>>>     extends List<? extends B>> lists) {
>>>         throw new AssertionError();
>>>       }
>>>     }
>>>     ===
>>>
>>>     $ javac A.java
>>>     A.java:6: error: incompatible types: inference variable B has
>>>     incompatible bounds
>>>         return cartesianProduct(Arrays.asList(lists));
>>>                                ^
>>>         equality constraints: B
>>>         lower bounds: T,List<? extends B>
>>>       where B,T are type-variables:
>>>         B extends Object declared in method
>>>     <B>cartesianProduct(List<? extends B>...)
>>>         T extends Object declared in method <T>asList(T...)
>>>     Note: /usr/local/google/home/cushon/A.java uses unchecked or
>>>     unsafe operations.
>>>     Note: Recompile with -Xlint:unchecked for details.
>>>     1 error
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20150708/8d4bdaab/attachment.html>


More information about the compiler-dev mailing list