Comparable und Comparator Interface in Java

Ich möchte eine generische Pair-Klasse schreiben, die zwei Mitglieder hat: key und value. Die einzige Anforderung an diese Klasse besteht darin, dass sowohl der Schlüssel als auch der Wert die Schnittstelle Comparable implementieren müssen, andernfalls akzeptiert die Pair-Klasse sie nicht als Typparameter.
Zuerst codiere ich es so:

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

Der JDK 1.6-Compiler generiert jedoch eine Warnung dazu:

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

Dann habe ich versucht, Typparameter hinzuzufügen und der Code sieht jetzt so aus:

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

Jetzt geht alles gut, bis ich versucht habe, einen Komparator für Pair zu generieren. (Der folgende Code ist in der Pair-Klasse.)

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;
        }
    };

Der Codefirst.getKey().compareTo(second.getKey()); erzeugt einen Fehler mit den Worten:

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

Weiß jemand, was diese Fehlermeldung bedeutet?
Alle Hinweise zu diesem Thema sind willkommen.

AKTUALISIEREN:
Hier ist der vollständige Code:

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 Können Sie etwas näher erläutern, warum der Compiler nicht sicherstellen kann, dass Objekte mit anderen Objekten desselben Typs verglichen werden. Im obigen Codesecond.getKey() Gibt den T1-Typ zurück, der vom selben Typ ist wiefirst.getKey()

Antworten auf die Frage(3)

Ihre Antwort auf die Frage