2010-11-19 4 views
4

Я пытаюсь реализовать generics в Java, используя интерфейс Comparable<T>.Использование generics в Comparable

public static <T> T[] sort(T[] a) { 
    //need to compare 2 elements of a 
} 

Скажем, я хочу, чтобы переопределить метод compareTo для указанного типа T в интерфейсе Comparable. То есть Мне нужно сравнить два элемента моего типа T, как я это сделаю? Я не знаю, каким будет мой тип T.

+5

Ваше название довольно ... общее. Пожалуйста, уточните свой вопрос. –

ответ

9

Вам необходимо установить ограничение типа на вашем методе.

public static <T extends Comparable<? super T>> T[] sort (T[] a) 
{ 
     //need to compare 2 elements of a 
} 

Это заставляет тип T иметь метод compareTo(T other). Это означает, что вы можете сделать следующее в вашем методе:

if (a[i].compareTo(a[j]) > 0) } 

} 
+0

@user, если честно, я не помню, зачем вам нужен дополнительный '? супер T'. Метод будет работать в большинстве случаев, если вы просто используете 'Comparable '. – jjnguy

+0

'' обозначает неизвестный тип, который является супертипом 'T' или, возможно,' T'. Аналогично '' - неизвестный подтип T или, возможно, сам T. – eaj

+0

'? super T' позволяет вам: 'class Person реализует Comparable ; class Student extends Person; 'и do' sort (new Student [] {}); ' – meriton

0

Попробуйте использовать <T extends Comparable<T>>, а затем compareTo

0

Старый вопрос, но ...

Как ответил jjnguy, вам нужно использовать:

public static <T extends Comparable<? super T>> T[] sort(T[] a) { 
    ... 
} 

Рассмотрим следующий пример:

public class A implements Comparable<A> {} 
public class B extends A {} 

Класс B неявно реализует Comparable<A>, а не Comparable<B>, поэтому ваш метод сортировки не может использоваться для массива B, если используется Comparable<T> вместо Comparable<? super T>. Если быть более точным:

public static <T extends Comparable<T>> T[] brokenSort(T[] a) { 
    ... 
} 

будет работать нормально в следующем случае:

A[] data = new A[3]; 
... 
data = brokenSort(A); 

, потому что в этом случае параметр типа T будет связан с A. Далее будет производить ошибку компиляции:

B[] data = new B[3]; 
... 
data = brokenSort(B); 

потому что T не может быть привязан к B, поскольку B не реализует Comparable<B>.

Смежные вопросы