Если вы хотите использовать то, что реализует, вы просто пишете, является общим параметр
class Bar extends Foo<String> { /* Code */}
Подстановочный знак, о котором вы говорите, - это три
- «? extends Type»: обозначает семейство подтипов типа Type. Этот является наиболее полезным подстановочным знаком
- «? super Type»: обозначает семейство супертипов типа
- «?»: обозначает набор всех типов или любого
Ваш метод должен выглядеть как
public static <T extends Comparable<? super T>> Collection<T> sort(T[] list) {
Collection<T> list = new ArrayList<T>();
//do quicksort
Arrays.sort(arr);
Collection<T> list = new ArrayList<T>();
int i;
for(i=0; i<arr.length-1; i++) {
if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list
list.add(arr[i]);
}
}
list.add(arr[i]); //add last element
//btw how do You know that last is not duplicate
return list;
}
Подробнее посетите эту страницу
Это просто соглашение, выбранное для дженериков. При использовании параметров ограниченного типа вы используете extends (хотя в некоторых случаях это может означать implements) или super.
Вы даже можете сделать что-то вроде
, чтобы определить, что объект, который заменит параметр типа, должен реализовать оба этих интерфейса.