Понимание синтаксиса быстрой сортировки

Я смущен этим синтаксисом, потому что сначала кажется, что функция должна возвращать <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 т.е. "?" может быть что угодно, что является суперклассом числа.

Другие вопросы по тегам