In addition, in the CSR of sequenced collection, it already
anticipated some other form of source incompatibility:
If a class implements List and Deque at the same time, the return type
of reversed() must extend both interfaces as well.

This alone would be a greater source incompatibility than this type
interference already; however, both are binarily compatible:
Java doesn't care about generics at runtime, and for default
reversed() overrides, reversed ()Ljava/util/List; and reversed
()Ljava/util/Deque; are distinct methods; code calling reversed via
List or Deque interfaces will get the reversed version of respective
interfaces, which are functionally correct as well.

I personally would consider this type inference usage moot. It is same
as adding another method addAll(List<String>) when there is already
addAll(String[]): existing addAll(null) calls will break, but this is
not a valid argument against adding a List<String> variant of addAll.

On Thu, May 4, 2023 at 9:38 PM Joseph D. Darcy <joe.da...@oracle.com> wrote:
>
> A few comments on the general compatibility policy for the JDK. Compatibility 
> is looked after by the Compatibility and Specification Review (CSR) process ( 
> Compatibility & Specification Review). Summarizing the approach,
>
> The general compatibility policy for exported APIs implemented in the JDK is:
>
>     * Don't break binary compatibility (as defined in the Java Language 
> Specification) without sufficient cause.
>     * Avoid introducing source incompatibilities.
>     * Manage behavioral compatibility changes.
>
> https://wiki.openjdk.org/display/csr/Main
>
> None of binary, source, and behavioral compatibly are absolutes and judgement 
> is used to assess the cost/benefits of changes. For example, strict source 
> compatibility would preclude, say, introducing new public types in the 
> java.lang package since the implicit import of types in java.lang could 
> conflict with a same-named type *-imported from another  package.
>
> When a proposed change is estimated to be sufficiently disruptive, we conduct 
> a corpus experiment to evaluate the impact on the change on many public Java 
> libraries. Back in Project Coin in JDK 7, that basic approach was used to 
> help quantify various language design choices and the infrastructure to run 
> such experiments has been built-out in the subsequent releases.
>
> HTH,
>
> -Joe
> CSR Group Lead
>
> On 5/4/2023 6:32 AM, Ethan McCue wrote:
>
> I guess this a good time to ask, ignoring the benefit part of a cost benefit 
> analysis, what mechanisms do we have to measure the number of codebases 
> relying on type inference this will break?
>
> Iirc Adoptium built/ran the unit tests of a bunch of public repos, but it's 
> also a bit shocking if the jtreg suite had nothing for this.
>
> On Thu, May 4, 2023, 9:27 AM Raffaello Giulietti 
> <raffaello.giulie...@oracle.com> wrote:
>>
>> Without changing the semantics at all, you could also write
>>
>>         final List<Collection<String>> list =
>> Stream.<Collection<String>>of(nestedDequeue, nestedList).toList();
>>
>> to "help" type inference.
>>
>>
>>
>>
>> On 2023-05-03 15:12, fo...@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.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