2015-07-26 3 views
2

Я смущен этим синтаксисом, потому что сначала кажется, что функция должна возвращать <E>, но затем я вижу void. Какова цель <E> до void?Понимание синтаксиса QuickSort

Кроме того, я знаком с ограничительными и дженериками, но я никогда не видел что-то ограниченное таким образом. Что означает этот синтаксис: Comparator<? super E>?

Вот пример функции:

private <E> void sort(E[] array, Comparator<? super E> cmp) { 
    qsort(array, 0, array.length - 1, cmp); 
} 
+2

«Какова цель' 'перед пустотой?" Он показывает, что это общий метод. «Что означает этот синтаксис« Компаратор '?» См. Https://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html. –

+0

https://docs.oracle.com/javase/tutorial/java/generics/methods.html –

+0

@JonSkeet спасибо, Джон. Этот синтаксис необязателен? –

ответ

3

Первый <E> не является типом - это ограничение типа.

Имейте в виду, что Java реализует дженерики с помощью типа стирания - это означает, что тип выполнения подписи этого метода является

private void sort(Object[] array, Comparator cmp) 

(удалив все в между <> с), таким образом метод имеет тип void возврата ,

Что <E> делает сказать, что типы массива входных и компаратора связаны: компаратор должен иметь возможность сравнивать «вещи» типа E, но это на самом деле не нужно обрабатывать только вещи из точное тип E.

Это то, что делает <? super E>: например, вы могли бы иметь Comparator<CharSequence>, а затем использовать его для сортировки String[], поскольку String подкласс CharSequence.

2
Comparator<? super E> 

? является символом подстановки и нижняя граница для этого Е.

, например:

private <E> void sort(E[] array, Comparator<? super E> cmp) 

если вы передаете

qsort(array, 0, array.length - 1, cmp); 

если массив Number [] затем нижняя граница "?" установлен в java.lang.Number, т.е. "?" может быть любым, что является супер-классом Number.

3

сначала появляется, как если функция должна возвращать <E>, но затем я вижу void

<E> части есть синтаксис для подачи универсальных методов их аргумент типа. Фактический тип возврата - void.

Что делает этот синтаксис означает, Comparator<? super E>

Это означает, что компаратор может быть для E или любого из его суперкласса.