RFR 8020156/8020009 TreeMap.values should report ORDERED/TreeMap.entrySet comparator should not be null
Paul Sandoz
paul.sandoz at oracle.com
Thu Jul 25 09:31:03 UTC 2013
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.
More information about the core-libs-dev
mailing list