The introduction of Sequenced collections is not a source compatible change

Tagir Valeev amaembo at gmail.com
Fri May 5 10:27:22 UTC 2023


Hello!

Such kind of incompatibility happens every single time the new
supertype is introduced for two types. E.g., consider:

import java.lang.invoke.MethodType;
import java.util.List;
import java.io.Serializable;

class Main {
  void test() {
    MethodType mt = MethodType.methodType(void.class);
    List<Serializable> list = List.of(mt, 1).subList(0,1);
  }
}

Compilable in Java 11, not compilable in Java 12+

Test.java:8: error: incompatible types: List<INT#1> cannot be
converted to List<Serializable>
    List<Serializable> list = List.of(mt, 1).subList(0,1);
                                                    ^
  where INT#1 is an intersection type:
    INT#1 extends Object,Serializable,Constable
1 error

I don't think that such a compatibility issue was even mentioned in
Java 12 release notes.

With best regards,
Tagir Valeev.

On Wed, May 3, 2023 at 3:13 PM <forax at univ-mlv.fr> wrote:
>
> 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.marks at oracle.com>
> > To: "Remi Forax" <forax at univ-mlv.fr>
> > Cc: "core-libs-dev" <core-libs-dev at 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


More information about the core-libs-dev mailing list