Понимание синтаксиса быстрой сортировки
Я смущен этим синтаксисом, потому что сначала кажется, что функция должна возвращать <E>
но потом я вижу void
, Какова цель <E>
до void
?
Кроме того, я знаком с ограничениями и дженериками, но я никогда не видел, чтобы что-то было ограничено таким образом. Что означает этот синтаксис Comparator<? super E>
?
Вот пример функции:
private <E> void sort(E[] array, Comparator<? super E> cmp) {
qsort(array, 0, array.length - 1, cmp);
}
3 ответа
Первый <E>
это не тип - это ограничение типа.
Имейте в виду, что Java реализует обобщенные типы посредством стирания типов - это означает, что сигнатура типа времени выполнения этого метода
private void sort(Object[] array, Comparator cmp)
(удалив все между <>
s) поэтому ваш метод имеет тип возвращаемого значения void
,
Какие <E>
означает, что типы входного массива и компаратора связаны между собой: компаратор должен уметь сравнивать "вещи" типа E
, но на самом деле он не должен обрабатывать только вещи точного типа E
,
Это то, что <? super E>
делает: например, вы могли бы иметь Comparator<CharSequence>
, а затем использовать это для сортировки String[]
, поскольку String
это подкласс CharSequence
,
сначала кажется, что функция должна вернуть
<E>
но потом я вижуvoid
<E>
Часть синтаксиса для предоставления универсальных методов их аргумент типа. Фактический тип возврата void
,
Что означает этот синтаксис
Comparator<? super E>
Это означает, что компаратор может быть для E
или для любого из его суперклассов.
Comparator<? super E>
? является символом подстановки и нижняя граница для этого является E.
например:
private <E> void sort(E[] array, Comparator<? super E> cmp)
если вы проходите
qsort(array, 0, array.length - 1, cmp);
если массив является Number[], то нижняя граница "?" устанавливается в java.lang.Number т.е. "?" может быть что угодно, что является суперклассом числа.