--- old/src/java.base/share/classes/java/util/Comparators.java 2015-02-04 10:44:10.689955891 +0100 +++ new/src/java.base/share/classes/java/util/Comparators.java 2015-02-04 10:44:10.572958060 +0100 @@ -22,14 +22,12 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package java.util; +package javany.util; import java.io.Serializable; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.ToDoubleFunction; -import java.util.function.ToIntFunction; -import java.util.function.ToLongFunction; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; /** * Package private supporting class for {@link Comparator}. @@ -39,22 +37,71 @@ throw new AssertionError("no instances"); } + // natural order comparisons (package-private - exposed via Comparator.naturalOrder()) + + @SuppressWarnings("unchecked") + static Comparator naturalOrder() { + return (Comparator) comparators.get(Comparator.class); + } + + private static final Map, Object> comparators = new HashMap<>(); + + @SuppressWarnings("unchecked") + private static void putComparator(Comparator comparator) { + comparators.put(Comparator.class, comparator); + } + + static { + putComparator((Comparator) Boolean::compare); + putComparator((Comparator) Byte::compare); + putComparator((Comparator) Short::compare); + putComparator((Comparator) Character::compare); + putComparator((Comparator) Integer::compare); + putComparator((Comparator) Long::compare); + putComparator((Comparator) Float::compare); + putComparator((Comparator) Double::compare); + putComparator(new Comparator() { + @Override + public int compare(Object a, Object b) { + if (a instanceof Comparable && b instanceof Comparable) { + @SuppressWarnings("unchecked") + Comparable c = (Comparable)a; + try { + return c.compareTo(b); + } catch (Exception e) { + throw new IllegalArgumentException( + "Can't compare mutually non-Comparable objects", e); + } + } else { + throw new IllegalArgumentException( + "Can't compare non-Comparable objects"); + } + } + }); + } + /** - * Compares {@link Comparable} objects in natural order. + * Reverses the order of given Comparator. * * @see Comparable */ - enum NaturalOrderComparator implements Comparator> { - INSTANCE; + static class ReverseComparator implements Comparator { + + private final Comparator comparator; + + ReverseComparator(Comparator comparator) { + this.comparator = comparator; + } @Override - public int compare(Comparable c1, Comparable c2) { - return c1.compareTo(c2); + public int compare(T c1, T c2) { + + return comparator.compare(c2, c1); } @Override - public Comparator> reversed() { - return Comparator.reverseOrder(); + public Comparator reversed() { + return comparator; } }