Hi, Please review the following patch that fixes two issues with TreeMap spliterators:
http://cr.openjdk.java.net/~psandoz/tl/JDK-8020156-8020009-TreeMap/webrev/ It's unfortunate and damn ugly that i resorted to using raw types and a cast for the EntrySet Spliterator.getComparator method: + // Since SORTED is reported and Map.Entry elements are not comparable + // then a non-null comparator needs to be returned + if (tree.comparator != null) { + // Adapt the existing non-null comparator to compare entries + // by key + return Map.Entry.comparingByKey(tree.comparator); + } + else { + // Return a comparator of entries by key, with K assumed to be + // of Comparable + // First obtain the Map.Entry.comparingByKey() comparator + // as a raw type since K is not declared with + // a upper bound of Comparable, then cast to the return type + @SuppressWarnings("rawtypes") + Comparator craw = Map.Entry.comparingByKey(); + @SuppressWarnings("unchecked") + Comparator<? super Map.Entry<K, V>> c = + (Comparator<? super Map.Entry<K, V>>) craw; + return c; + } Perhaps rather than reusing a Map.Entry comparator method it is clearer to do the following: return (Comparator<? super Map.Entry<K, V>> & Serializable) (e1, e2) -> { @SuppressWarnings("unchecked") Comparable<? super K> k1 = (Comparable<? super K>) e1.getKey(); return k1.compareTo(e2.getKey()); }; ? I marginally prefer that. I created a new test java/util/Spliterators/SpliteratorCharacteristics that we can fill out over time for other collections as and when needed. Paul.