< prev index next >

src/java.base/share/classes/java/util/Comparators.java

Print this page

        

@@ -20,43 +20,90 @@
  *
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * 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}.
  */
 class Comparators {
     private Comparators() {
         throw new AssertionError("no instances");
     }
 
+    // natural order comparisons (package-private - exposed via Comparator.naturalOrder())
+
+    @SuppressWarnings("unchecked")
+    static <any T> Comparator<T> naturalOrder() {
+        return (Comparator<T>) comparators.get(Comparator<T>.class);
+    }
+
+    private static final Map<Class<?>, Object> comparators = new HashMap<>();
+
+    @SuppressWarnings("unchecked")
+    private static <any T> void putComparator(Comparator<T> comparator) {
+        comparators.put(Comparator<T>.class, comparator);
+    }
+
+    static {
+        putComparator((Comparator<boolean>) Boolean::compare);
+        putComparator((Comparator<byte>) Byte::compare);
+        putComparator((Comparator<short>) Short::compare);
+        putComparator((Comparator<char>) Character::compare);
+        putComparator((Comparator<int>) Integer::compare);
+        putComparator((Comparator<long>) Long::compare);
+        putComparator((Comparator<float>) Float::compare);
+        putComparator((Comparator<double>) Double::compare);
+        putComparator(new Comparator<Object>() {
+            @Override
+            public int compare(Object a, Object b) {
+                if (a instanceof Comparable && b instanceof Comparable) {
+                    @SuppressWarnings("unchecked")
+                    Comparable<Object> c = (Comparable<Object>)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<Comparable<Object>> {
-        INSTANCE;
+    static class ReverseComparator<any T> implements Comparator<T> {
+
+        private final Comparator<T> comparator;
+
+        ReverseComparator(Comparator<T> comparator) {
+            this.comparator = comparator;
+        }
 
         @Override
-        public int compare(Comparable<Object> c1, Comparable<Object> c2) {
-            return c1.compareTo(c2);
+        public int compare(T c1, T c2) {
+
+            return comparator.compare(c2, c1);
         }
 
         @Override
-        public Comparator<Comparable<Object>> reversed() {
-            return Comparator.reverseOrder();
+        public Comparator<T> reversed() {
+            return comparator;
         }
     }
 
     /**
      * Null-friendly comparators
< prev index next >