Interfaz comparable y comparativa en Java

Quiero escribir una clase de par genérico, que tiene dos miembros: clave y valor. El único requisito para esta clase es que tanto la clave como el valor deben implementar la interfaz Comparable, de lo contrario, la clase Pair no los aceptará como parámetro de tipo.
Primero lo codifico así:

public class Pair<T1 extends Comparable, T2 extends Comparable>

Pero el compilador JDK 1.6 generará una advertencia sobre esto:

Comparable is a raw type. References to generic type Comparable<T> should be parameterized

Luego intenté agregar parámetros de tipo y el código ahora se ve así:

public class Pair<T1 extends Comparable<? extends Object>,
                  T2 extends Comparable<? extends Object>>

Ahora todo va bien hasta que intenté generar un Comparador para el par (el siguiente código está en la clase Par)

public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
        public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
            *first.getKey().compareTo(second.getKey());*
            return 0;
        }
    };

El códigofirst.getKey().compareTo(second.getKey()); generará un error diciendo:

The method compareTo(capture#1-of ? extends Object) in the type Comparable<capture#1-of ? extends Object> is not applicable for the  arguments (T1)

¿Alguien sabe qué significa este mensaje de error?
Cualquier sugerencia sobre este tema es bienvenida.

ACTUALIZAR:
Aquí está el código completo:

public class Pair<T1 extends Comparable<? extends Object>, T2 extends Comparable<? extends Object>> {
    private T1 key;
    private T2 value;

    public static int ascending = 1;
    public final Comparator<Pair<T1, T2>> KEY_COMPARATOR = new Comparator<Pair<T1, T2>>() {
        public int compare(Pair<T1, T2> first, Pair<T1, T2> second) {
            int cmp = first.getKey().compareTo((T1)(second.getKey()));
            if (cmp > 0)  return ascending;
            return -ascending;
        }
    };
}

@MarvinLabs ¿Puede explicar un poco más por qué el compilador no puede asegurarse de que los objetos se comparan con otros objetos del mismo tipo? En el código anterior,second.getKey() devuelve el tipo T1, que es del mismo tipo quefirst.getKey()

Respuestas a la pregunta(3)

Su respuesta a la pregunta