Change in type inference behaviour with JDK-8078024

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


On 07/08/2015 01:39 PM, Vicente-Arturo Romero-Zaldivar wrote:
> 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.

done: https://bugs.openjdk.java.net/browse/JDK-8130803

Thanks,
Vicente

>
> 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/67a32313/attachment-0001.html>


More information about the compiler-dev mailing list