2013-02-21 3 views
1

Я знаю дженерики, но я не понимаю этого синтаксиса. Например, в Collections.sort():Уточнение необходимо в статических методах в коллекциях в java?

public static <T> void sort(List<T> list, Comparator<? super T> c) 

Какое значение статического <T> прежде чем возвращение типа пустоте?

+0

Моим вопрос должен быть яснее, я понимаю «статическая» часть вопроса находится на родовые .Отредактированный вопрос, чтобы выделить только общий Ramp

ответ

3

Метод подписи от sort:

public static <T> void sort(List<T> list, Comparator<? super T> c) { 

Это <T> определяет произвольный обобщенный тип T, который может быть ссылка в определении метода.

То, что мы говорим здесь является то, что метод требует List некоторого типа (мы не заботимся, какой) Т и Comparator другого типа, но этот тип должен быть супертипом Т. Это означает, что мы можем сделать это:

Collections.sort(new ArrayList<String>(), new Comparator<String>()); 
Collections.sort(new ArrayList<Integer>(), new Comparator<Number>()); 

Но это не

Collections.sort(new ArrayList<String>(), new Comparator<Integer>()); 
+0

Связь между списком и его компаратором устанавливается в самих параметрах, когда мы говорим «Список » и «Компаратор ». Что именно задает ? – Ramp

+0

Ничего. Но вам нужно объявить 'T' где-то. Вы можете сделать это в верхней части класса, и это означает, что у вас есть один и тот же 'T' всюду, или вы можете сделать это на основе метода, как здесь. –

1

Вы можете сортировать файлы без создания объектов Collections. Метод sort() является статическим методом класса Collections.

Рассмотрим разницу в синтаксисе между:

Collections col = new Collections(); 
col.sort(someCollection); 

и

Collections.sort(someCollection); 

sort() метод не должен полагаться на свойства объекта некоторые возможные коллекции. Поэтому лучше заявить, что это метод static как вопрос дизайна.

2

Каково значение статического <T> перед возвратом типа void?

Это обобщенный метод и <T> является его параметр типа. В нем говорится, что он сортирует список, содержащий объекты любого типа (List<T>), если компаратор может сравнивать объекты этого типа или любые его супертипы (Comparator<? super T>). Таким образом, компилятор позволит звонить sort мимоходом, например, List<Integer> и Comparator<Number> (как Integer является подтипом Number), но не List<Object> и Comparator<String>.

1

<T> называется параметром типа, который здесь используется для абстрагирования по типу элементов, на которых работает метод сортировки. У вас могут быть параметры типа для класса или метода. Это синтаксис для указания параметра типа для метода, который должен быть до типа возврата метода.

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