Дженерики и сортирующий в Java

Предположим, что Вы пишете статическую функцию в Java для сортировки массива, во многом как Arrays.sort(). Проблема с Arrays.sort() это, это получает массив Объекта и бросает a ClassCastException если его элементы не реализуют Comparable.

Таким образом, Вы хотите, чтобы Ваша функция получила как аргумент массив подтипа Comparable. Что-то как этот могло работать:

static <T extends Comparable> void sort(T[] array);

Проблема с той подписью состоит в том, что можно все еще передать массив Comparables с Целыми числами и Строками, например, которые вызвали бы a RuntimeException.

Так, как можно создать функцию, которая получит только массив, элементы которого реализуют Сопоставимый и имеют весь одинаковый тип (например, Целое число, Строка, и т.д.?)

14
задан Tom 2 November 2015 в 09:57
поделиться

3 ответа

-

Ответ Dirk - это лучшее, что вы можете получить, но коллекции Google использовались именно так, как вы писали, чтобы избежать ошибки в Javac:

Почему вы используете тип В различных API, которые не «полностью извлечен»? Разве это не должно быть > , > или > ?

Последнее предложение является правильным, как объяснено в эффективности Ява. Однако мы будем использовать > на Методы без параметра для того, чтобы работать вокруг отвратительной ошибки Javac. Это заставит вас проблемы, когда вы используете очень необычный тип, как Java.sql.timestamp , который сопоставим с Supertype. (Нужно больше объяснения.)

От: http://code.google.com/p/google-collections/wiki/faq

Теперь это зависит от вас ...

14
ответ дан 1 December 2019 в 07:06
поделиться

В мире Post-1.5 Java справочные массивы - это только детали реализации низкого уровня. Предпочитаю, коллекции.

Если вы заинтересованы в справочных массивах, для какой-то особенности, вы будете осознавать, что они действительно не будут работать с дженерами. Вы не можете (разумно) иметь массив универсального типа, например , сопоставимый . Это означает, что если массивы.sort были выпущены аналогичным образом к коллекциям .sort Это было бы преодолено.

Из-за особенности набора массива, если вы хотели переоценить типы, , я думаю Сортировка может быть написано более просто чем Collections.sort без жертвы что-нибудь значимое.

public static <T extends Comparable<T>> sort(T[] array)

Если вы хотите, чтобы двоичная совместимость с предварительными значениями, то вам понадобится небольшой взлом, чтобы вернуться к объекту [] подпись, аналогичным образом, подобным подобным коллекциям . .

public static <T extends Object & Comparable<T>> sort(T[] array)
2
ответ дан 1 December 2019 в 07:06
поделиться

Использовать

static <T extends Comparable<? super T>> sort(T[] array);

, что является наиболее общей спецификацией для выполнения задачи. По сути, она утверждает, что T - это тип, который можно сравнить с самим собой.

23
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: