[FUNCTOR-22] Added generics to ComparableComparator. Few other classes that used the ComparableComparator were updated too. Tests were also updated accordingly. 

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/functor/trunk@1364676 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c5b835e..1a7ad62 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -23,6 +23,9 @@
   </properties>
   <body>
     <release version="1.0" date="2012-??-??" description="First release.">
+      <action dev="kinow" issue="FUNCTOR-22">
+        Generify ComparableComparator.
+      </action>
       <action dev="kinow" issue="FUNCTOR-3">
         Reduce the use of raw types in test classes.
       </action>
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/ComparableComparator.java b/src/main/java/org/apache/commons/functor/core/comparator/ComparableComparator.java
index 063d533..838c96c 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/ComparableComparator.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/ComparableComparator.java
@@ -20,33 +20,37 @@
 import java.util.Comparator;
 
 /**
- * See Commons-Collections for a public version
- * of this class.
+ * A {@link Comparator Comparator} that compares {@link Comparable Comparable}
+ * objects.
+ * <p>
+ * This class was created based on commons-collection's ComparableComparator.
  *
+ * @param <E> the comparable type
  * @version $Revision$ $Date$
  */
-@SuppressWarnings({ "unchecked", "rawtypes" })
-final class ComparableComparator implements Comparator, Serializable {
+final class ComparableComparator<E extends Comparable<? super E>> implements Comparator<E>, Serializable {
 
     /** Singleton. */
-    public static final ComparableComparator INSTANCE = new ComparableComparator();
+    @SuppressWarnings("rawtypes")
+    public static final ComparableComparator<?> INSTANCE = new ComparableComparator();
 
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = -5849476573719561212L;
+    private static final long serialVersionUID = 9098756963321230038L;
 
     /**
      * Create a new ComparableComparator.
      */
     public ComparableComparator() {
+        super();
     }
 
     /**
      * {@inheritDoc}
      */
-    public int compare(Object o1, Object o2) {
-        return ((Comparable) o1).compareTo(o2);
+    public int compare(E o1, E o2) {
+        return o1.compareTo(o2);
     }
 
     /**
@@ -75,10 +79,12 @@
 
     /**
      * Get a ComparableComparator instance.
+     * @param <E> the comparable type
      * @return ComparableComparator
      */
-    public static ComparableComparator instance() {
-        return INSTANCE;
+    @SuppressWarnings("unchecked")
+    public static <E extends Comparable<? super E>> ComparableComparator<E> instance() {
+        return (ComparableComparator<E>) INSTANCE;
     }
 
 }
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java b/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java
index 12c451b..0c788a7 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/ComparatorFunction.java
@@ -102,6 +102,6 @@
      */
     @SuppressWarnings("unchecked")
     public static <T> ComparatorFunction<T> instance() {
-        return new ComparatorFunction<T>(ComparableComparator.INSTANCE);
+        return new ComparatorFunction<T>((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 }
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java b/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java
index b6ea029..e9eae29 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/IsEquivalent.java
@@ -45,7 +45,7 @@
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = -6392784113015793664L;
+    private static final long serialVersionUID = 1884411899682486777L;
 
     /**
      * The wrapped comparator.
@@ -57,7 +57,7 @@
      */
     @SuppressWarnings("unchecked")
     public IsEquivalent() {
-        this(ComparableComparator.INSTANCE);
+        this((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
@@ -132,7 +132,7 @@
      */
     @SuppressWarnings("unchecked")
     public static <T extends Comparable<?>> IsEquivalent<T> instance() {
-        return new IsEquivalent<T>(ComparableComparator.INSTANCE);
+        return new IsEquivalent<T>((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java b/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java
index 9c1c291..96df3ca 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThan.java
@@ -44,7 +44,7 @@
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = -8592932496891910273L;
+    private static final long serialVersionUID = 377027098765821021L;
 
     /**
      * The wrapped comparator.
@@ -57,7 +57,7 @@
      */
     @SuppressWarnings("unchecked")
     public IsGreaterThan() {
-        this(ComparableComparator.INSTANCE);
+        this((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java b/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java
index 2a856f4..b460172 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/IsGreaterThanOrEqual.java
@@ -45,7 +45,7 @@
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = 5262405026444050167L;
+    private static final long serialVersionUID = 1550544203070228570L;
 
     /**
      * The wrapped comparator.
@@ -58,7 +58,7 @@
      */
     @SuppressWarnings("unchecked")
     public IsGreaterThanOrEqual() {
-        this(ComparableComparator.INSTANCE);
+        this((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java b/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java
index 53c4388..efea89c 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/IsLessThan.java
@@ -44,7 +44,7 @@
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = 1809153179639613842L;
+    private static final long serialVersionUID = 6948263958172180877L;;
 
     /**
      * The wrapped comparator.
@@ -57,7 +57,7 @@
      */
     @SuppressWarnings("unchecked")
     public IsLessThan() {
-        this(ComparableComparator.INSTANCE);
+        this((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java b/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java
index ad2fac1..1a5c888 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/IsLessThanOrEqual.java
@@ -44,7 +44,7 @@
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = -7270189005780457145L;
+    private static final long serialVersionUID = -5791636848361450563L;
 
     /**
      * The wrapped comparator.
@@ -57,7 +57,7 @@
      */
     @SuppressWarnings("unchecked")
     public IsLessThanOrEqual() {
-        this(ComparableComparator.INSTANCE);
+        this((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java b/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java
index 38cbef5..f0ef32a 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/IsNotEquivalent.java
@@ -57,7 +57,7 @@
      */
     @SuppressWarnings("unchecked")
     public IsNotEquivalent() {
-        this(ComparableComparator.INSTANCE);
+        this((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
@@ -132,7 +132,7 @@
      */
     @SuppressWarnings("unchecked")
     public static <T extends Comparable<?>> IsNotEquivalent<T> instance() {
-        return new IsNotEquivalent<T>(ComparableComparator.INSTANCE);
+        return new IsNotEquivalent<T>((Comparator<? super T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/Max.java b/src/main/java/org/apache/commons/functor/core/comparator/Max.java
index 7b67740..5569f27 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/Max.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/Max.java
@@ -53,7 +53,7 @@
      */
     @SuppressWarnings("unchecked")
     public Max() {
-        this(ComparableComparator.instance());
+        this((Comparator<T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/functor/core/comparator/Min.java b/src/main/java/org/apache/commons/functor/core/comparator/Min.java
index a28033f..bface4f 100644
--- a/src/main/java/org/apache/commons/functor/core/comparator/Min.java
+++ b/src/main/java/org/apache/commons/functor/core/comparator/Min.java
@@ -41,7 +41,7 @@
     /**
      * serialVersionUID declaration.
      */
-    private static final long serialVersionUID = 9190170976707323848L;
+    private static final long serialVersionUID = -3538911698805767997L;
 
     /**
      * The wrapped comparator.
@@ -53,7 +53,7 @@
      */
     @SuppressWarnings("unchecked")
     public Min() {
-        this(ComparableComparator.instance());
+        this((Comparator<T>) ComparableComparator.INSTANCE);
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestComparableComparator.java b/src/test/java/org/apache/commons/functor/core/comparator/TestComparableComparator.java
index f9da547..bdeb139 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestComparableComparator.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestComparableComparator.java
@@ -18,7 +18,6 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import org.junit.Test;
 
@@ -32,37 +31,22 @@
 
     @Test
     public void testCompareIntegers() {
-        assertTrue(ComparableComparator.instance().compare(new Integer(Integer.MIN_VALUE),new Integer(Integer.MIN_VALUE)) == 0);
-        assertTrue(ComparableComparator.instance().compare(new Integer(-1),new Integer(-1)) == 0);
-        assertTrue(ComparableComparator.instance().compare(new Integer(0),new Integer(0)) == 0);
-        assertTrue(ComparableComparator.instance().compare(new Integer(Integer.MAX_VALUE),new Integer(Integer.MAX_VALUE)) == 0);
-        assertTrue(ComparableComparator.instance().compare(new Integer(1),new Integer(1)) == 0);
+        assertTrue(ComparableComparator.<Integer>instance().compare(new Integer(Integer.MIN_VALUE),new Integer(Integer.MIN_VALUE)) == 0);
+        assertTrue(ComparableComparator.<Integer>instance().compare(new Integer(-1),new Integer(-1)) == 0);
+        assertTrue(ComparableComparator.<Integer>instance().compare(new Integer(0),new Integer(0)) == 0);
+        assertTrue(ComparableComparator.<Integer>instance().compare(new Integer(Integer.MAX_VALUE),new Integer(Integer.MAX_VALUE)) == 0);
+        assertTrue(ComparableComparator.<Integer>instance().compare(new Integer(1),new Integer(1)) == 0);
     }
 
-    @Test
-    public void testCompareIncomparable() {
-        try {
-            ComparableComparator.instance().compare(new Object(),new Integer(2));
-            fail("Expected ClassCastException");
-        } catch(ClassCastException e) {
-            // expected
-        }
-    }
-
-    @Test
+    @Test(expected=NullPointerException.class)
     public void testCompareNull() {
-        try {
-            ComparableComparator.instance().compare(null,new Integer(2));
-            fail("Expected NullPointerException");
-        } catch(NullPointerException e) {
-            // expected
-        }
+        ComparableComparator.<Integer>instance().compare(null,new Integer(2));
     }
 
     @Test
     public void testEqualsAndHashCode() {
-        assertEquals(new ComparableComparator(),new ComparableComparator());
-        assertEquals(new ComparableComparator().hashCode(),new ComparableComparator().hashCode());
-        assertTrue(!new ComparableComparator().equals(null));
+        assertEquals(new ComparableComparator<Integer>(),new ComparableComparator<Integer>());
+        assertEquals(new ComparableComparator<Integer>().hashCode(),new ComparableComparator<Integer>().hashCode());
+        assertTrue(!new ComparableComparator<Integer>().equals(null));
     }
 }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestComparatorFunction.java b/src/test/java/org/apache/commons/functor/core/comparator/TestComparatorFunction.java
index 3b838f5..c52379f 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestComparatorFunction.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestComparatorFunction.java
@@ -75,11 +75,10 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() {
         ComparatorFunction<Comparable<?>> f = ComparatorFunction.instance();
         assertObjectsAreEqual(f,f);
-        assertObjectsAreEqual(f,new ComparatorFunction<Comparable<?>>(ComparableComparator.INSTANCE));
+        assertObjectsAreEqual(f,new ComparatorFunction<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreNotEqual(f,new ComparatorFunction<Boolean>(Collections.reverseOrder()));
     }
 }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestIsEquivalent.java b/src/test/java/org/apache/commons/functor/core/comparator/TestIsEquivalent.java
index 7d6f265..5ca3d2f 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestIsEquivalent.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestIsEquivalent.java
@@ -55,13 +55,12 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() throws Exception {
         IsEquivalent<Comparable<?>> p = IsEquivalent.INSTANCE;
         assertEquals(p,p);
 
         assertObjectsAreEqual(p,IsEquivalent.instance());
-        assertObjectsAreEqual(p,new IsEquivalent<Comparable<?>>(new ComparableComparator()));
+        assertObjectsAreEqual(p,new IsEquivalent<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreNotEqual(p,Constant.FALSE);
     }
 
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThan.java b/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThan.java
index 9d91535..2b7e059 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThan.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThan.java
@@ -56,13 +56,12 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() throws Exception {
         IsGreaterThan<Comparable<?>> p = new IsGreaterThan<Comparable<?>>();
         assertEquals(p,p);
 
         assertObjectsAreEqual(p,new IsGreaterThan<Comparable<?>>());
-        assertObjectsAreEqual(p,new IsGreaterThan<Comparable<?>>(new ComparableComparator()));
+        assertObjectsAreEqual(p,new IsGreaterThan<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreEqual(p,IsGreaterThan.instance());
         assertObjectsAreNotEqual(p,Constant.FALSE);
     }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThanOrEqual.java b/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThanOrEqual.java
index 1ee0535..2a7be35 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThanOrEqual.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestIsGreaterThanOrEqual.java
@@ -56,13 +56,12 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() throws Exception {
         IsGreaterThanOrEqual<Comparable<?>> p = new IsGreaterThanOrEqual<Comparable<?>>();
         assertEquals(p,p);
 
         assertObjectsAreEqual(p,new IsGreaterThanOrEqual<Comparable<?>>());
-        assertObjectsAreEqual(p,new IsGreaterThanOrEqual<Comparable<?>>(new ComparableComparator()));
+        assertObjectsAreEqual(p,new IsGreaterThanOrEqual<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreEqual(p,IsGreaterThanOrEqual.instance());
         assertObjectsAreNotEqual(p,Constant.FALSE);
     }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThan.java b/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThan.java
index a476a1f..64cce4f 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThan.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThan.java
@@ -56,13 +56,12 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() throws Exception {
         IsLessThan<Comparable<?>> p = new IsLessThan<Comparable<?>>();
         assertEquals(p,p);
 
         assertObjectsAreEqual(p,new IsLessThan<Comparable<?>>());
-        assertObjectsAreEqual(p,new IsLessThan<Comparable<?>>(new ComparableComparator()));
+        assertObjectsAreEqual(p,new IsLessThan<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreEqual(p,IsLessThan.instance());
         assertObjectsAreNotEqual(p,Constant.FALSE);
     }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThanOrEqual.java b/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThanOrEqual.java
index d606f6e..2403f11 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThanOrEqual.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestIsLessThanOrEqual.java
@@ -56,13 +56,12 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() throws Exception {
         IsLessThanOrEqual<Comparable<?>> p = new IsLessThanOrEqual<Comparable<?>>();
         assertEquals(p,p);
 
         assertObjectsAreEqual(p,new IsLessThanOrEqual<Comparable<?>>());
-        assertObjectsAreEqual(p,new IsLessThanOrEqual<Comparable<?>>(new ComparableComparator()));
+        assertObjectsAreEqual(p,new IsLessThanOrEqual<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreEqual(p,IsLessThanOrEqual.instance());
         assertObjectsAreNotEqual(p,Constant.FALSE);
     }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestIsNotEquivalent.java b/src/test/java/org/apache/commons/functor/core/comparator/TestIsNotEquivalent.java
index 5c0fc9d..8b98c1f 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestIsNotEquivalent.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestIsNotEquivalent.java
@@ -55,12 +55,11 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() throws Exception {
         IsNotEquivalent<Comparable<?>> p = new IsNotEquivalent<Comparable<?>>();
         assertEquals(p,p);
 
-        assertObjectsAreEqual(p,new IsNotEquivalent<Comparable<?>>(new ComparableComparator()));
+        assertObjectsAreEqual(p,new IsNotEquivalent<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreEqual(p,IsNotEquivalent.instance());
         assertObjectsAreNotEqual(p,Constant.FALSE);
     }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestMax.java b/src/test/java/org/apache/commons/functor/core/comparator/TestMax.java
index dbea313..9fd8022 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestMax.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestMax.java
@@ -56,12 +56,11 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() {
         Max<Comparable<?>> f = Max.instance();
         assertObjectsAreEqual(f,f);
         assertObjectsAreEqual(f,Max.instance());
-        assertObjectsAreEqual(f,new Max<Comparable<?>>(ComparableComparator.INSTANCE));
+        assertObjectsAreEqual(f,new Max<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreNotEqual(f,new Max<Comparable<?>>(Collections.<Comparable<?>>reverseOrder()));
     }
 }
diff --git a/src/test/java/org/apache/commons/functor/core/comparator/TestMin.java b/src/test/java/org/apache/commons/functor/core/comparator/TestMin.java
index f53125d..e9f4815 100644
--- a/src/test/java/org/apache/commons/functor/core/comparator/TestMin.java
+++ b/src/test/java/org/apache/commons/functor/core/comparator/TestMin.java
@@ -56,12 +56,11 @@
     }
 
     @Test
-    @SuppressWarnings("unchecked")
     public void testEquals() {
         Min<Comparable<?>> f = Min.instance();
         assertObjectsAreEqual(f,f);
         assertObjectsAreEqual(f,Min.instance());
-        assertObjectsAreEqual(f,new Min<Comparable<?>>(ComparableComparator.INSTANCE));
+        assertObjectsAreEqual(f,new Min<Integer>(ComparableComparator.<Integer>instance()));
         assertObjectsAreNotEqual(f,new Min<Comparable<?>>(Collections.<Comparable<?>>reverseOrder()));
     }
 }