Сравнимый и компараторский интерфейс в Java
Я хочу написать общий класс Pair, который имеет два члена: ключ и значение. Единственное требование к этому классу состоит в том, что и ключ, и значение должны реализовывать интерфейс Comparable, в противном случае класс Pair не примет их в качестве параметра типа.
Сначала я пишу это так:
public class Pair<T1 extends Comparable, T2 extends Comparable>
Но компилятор JDK 1.6 выдаст предупреждение об этом:
Comparable is a raw type. References to generic type Comparable<T> should be parameterized
Затем я попытался добавить параметры типа, и код теперь выглядит так:
public class Pair<T1 extends Comparable<? extends Object>,
T2 extends Comparable<? extends Object>>
Теперь все идет хорошо, пока я не попытался сгенерировать Comparator for Pair. (Следующий код находится в классе Pair)
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;
}
};
Кодfirst.getKey().compareTo(second.getKey());
выдаст ошибку, говорящую:
The method compareTo(capture#1-of ? extends Object) in the type Comparable<capture#1-of ? extends Object> is not applicable for the arguments (T1)
Кто-нибудь знает, что означает это сообщение об ошибке?
Любые намеки на эту тему приветствуются.
ОБНОВИТЬ:
Вот полный код:
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 Можете ли вы объяснить немного больше, почему компилятор не может убедиться, что объекты сравниваются с другими объектами того же типа? В приведенном выше коде,second.getKey()
возвращает тип T1 того же типа, что иfirst.getKey()