On 4/28/21 2:04 AM, Stuart Marks wrote:
Binary compatibility is important. And I guess there is a variant of the proposal that includes ReversibleCollection and ReversibleSet and is binary compatible.

Yes, the source incompatibilities with the types seem to involve type inference (e.g., use of var choosing differently based on new types in the library) so it should be possible to make minor source code changes to adjust or override the type that's inferred.

On binary compatibility, that comes mostly from the newly introduced methods (reversed, addFirst etc.) and from adding covariant overrides to LinkedHashSet. I guess the "variant" you mention is adding new methods with the new return types (e.g., reversibleEntrySet) instead of covariant overrides. Or was it something else?


Right, either adding new method with different name or not doing anything (left to user to insert a cast). As you already pointed out, introduction of NavigableSet/NavigableMap opted for new method name: (navigableKeySet) and new method parameters (subMap, headMap, tailMap) which were actually useful. So this trick might also bi applicable here:


public interface SortedMap/LinkedHashMap<K, V> {

    ReversibleSet<Entry<K, V>> entrySet(boolean reversed);

    ReversibleSet<K> keySet(boolean reversed);

    ReversibleCollection<V> values(boolean reversed);



So you would say:

    map.keySet(false) or map.keySet(true)

instead of:

    map.reversibleKeySet() or map.reversibleKeySet().reversed()


The later is more readable, but nowadays almost everybody uses IDE(s), so they see the following for the former:

    map.keySet(reversed: false) or map.keySet(reversed: true)


Peter



Peter


Reply via email to