Another example sent to me by a fellow French guy,

    final Deque<String> nestedDequeue = new ArrayDeque<>();
    nestedDequeue.addFirst("C");
    nestedDequeue.addFirst("B");
    nestedDequeue.addFirst("A");

    final List<String> nestedList = new ArrayList<>();
    nestedList.add("D");
    nestedList.add("E");
    nestedList.add("F");

    final List<Collection<String>> list = Stream.of(nestedDequeue, 
nestedList).toList();

This one is cool because no 'var' is involved and using 
collect(Collectors.toList()) instead of toList() solves the inference problem.

Rémi

----- Original Message -----
> From: "Stuart Marks" <stuart.ma...@oracle.com>
> To: "Remi Forax" <fo...@univ-mlv.fr>
> Cc: "core-libs-dev" <core-libs-...@openjdk.java.net>
> Sent: Tuesday, May 2, 2023 2:44:28 AM
> Subject: Re: The introduction of Sequenced collections is not a source 
> compatible change

> Hi Rémi,
> 
> Thanks for trying out the latest build!
> 
> I'll make sure this gets mentioned in the release note for Sequenced
> Collections.
> We'll also raise this issue when we talk about this feature in the Quality
> Outreach
> program.
> 
> s'marks
> 
> On 4/29/23 3:46 AM, Remi Forax wrote:
>> I've several repositories that now fails to compile with the latest jdk21, 
>> which
>> introduces sequence collections.
>> 
>> The introduction of a common supertype to existing collections is *not* a 
>> source
>> compatible change because of type inference.
>> 
>> Here is a simplified example:
>> 
>>    public static void m(List<Supplier<? extends Map<String, String>>> 
>> factories) {
>>    }
>> 
>>    public static void main(String[] args) {
>>      Supplier<LinkedHashMap<String,String>> supplier1 = LinkedHashMap::new;
>>      Supplier<SortedMap<String,String>> supplier2 = TreeMap::new;
>>      var factories = List.of(supplier1, supplier2);
>>      m(factories);
>>    }
>> 
>> 
>> This example compiles fine with Java 20 but report an error with Java 21:
>>    SequencedCollectionBug.java:28: error: method m in class 
>> SequencedCollectionBug
>>    cannot be applied to given types;
>>      m(factories);
>>      ^
>>    required: List<Supplier<? extends Map<String,String>>>
>>    found:    List<Supplier<? extends SequencedMap<String,String>>>
>>    reason: argument mismatch; List<Supplier<? extends 
>> SequencedMap<String,String>>>
>>    cannot be converted to List<Supplier<? extends Map<String,String>>>
>> 
>> 
>> 
>> Apart from the example above, most of the failures I see are in the unit 
>> tests
>> provided to the students, because we are using a lot of 'var' in them so they
>> work whatever the name of the types chosen by the students.
>> 
>> Discussing with a colleague, we also believe that this bug is not limited to
>> Java, existing Kotlin codes will also fail to compile due to this bug.
>> 
>> Regards,
> > Rémi

Reply via email to