Дженерики Java:Как привести к (T расширяет сопоставимый<?super T>) без необработанных типов

StackOverflow https://stackoverflow.com/questions/5016945

Вопрос

Интересно, можно ли привести значение, несопоставимое с чем-либо, так, чтобы оно соответствовало параметру метода T, который имеет тип шаблона <T extends Comparable<? super T>>, подобно тому , как Collections.sort() метод

public static <T extends Comparable<? super T>> void sort(List<T> list)

Предположим, у меня где-то есть ссылка на список несопоставимых объектов, и я хочу вызвать этот метод, приведя его следующим образом:

List<E> foo = new List<E>(a);
Collections.sort( /* magic cast */ foo);

Я могу сделать это, если приведу к (List<? extends Comparable>), но это генерирует предупреждение о том, что я использую необработанные типы (в данном случае сопоставимые без типов шаблонов).Допустим, я хочу избежать использования необработанных типов или даже подавления их с помощью @SuppressWarnings("rawtypes") (например,чтобы сохранить обратную совместимость и избежать использования необработанных типов).

Можно ли избежать использования необработанных типов путем приведения к (List<? extends Comparable</*something*/>>) и что бы это могло быть за "что-то" (допустимо непроверенное приведение)?

РЕДАКТИРОВАТЬ:Этот пример просто для того, чтобы проиллюстрировать суть.На самом деле у меня нет Comparable, и я не хочу ничего сортировать, но мне просто нужно динамически проверить, относится ли что-либо к какому-либо типу (Comparable в этом примере) (через instanceof), а затем передать некоторый аргумент методу, который имеет аргументы шаблона, аналогичные Collections.sort() метод.

Это было полезно?

Решение

Бросьте его в

Collections.sort((List<Comparable<Object>>) list);

Это не приведет к появлению предупреждений "rawtype".Всего одно предупреждение о "непроверенном приведении" (которое вы все равно получите).

Судя по тому, что вы упомянули в РЕДАКТИРОВАТЬ, в конечном счете, вы хотите сделать что-то подобное?

if(!list.isEmpty() && list.get(0) instanceof Comparable){
    List<Comparable<Object>> cmprList = (List<Comparable<Object>>)list;
    Collections.sort(cmprList);
}

Другие советы

Это, конечно, невозможно. Collections.sort требует, чтобы Comparable для того, чтобы вызвать compareTo() метод.Итак, по вашему мнению, что должно произойти, когда sort get представляет собой коллекцию несопоставимых объектов?

Возможно, вы хотите использовать что-то вроде упорядочения по умолчанию, например, на основе ссылок.Но такая вещь не существует неявно.Хотя, это может быть реализовано.Но я сомневаюсь, что это то, чего вы хотите?Итак, почему вы хотите отсортировать список в первую очередь?И как следует отсортировать эти элементы?

Это будет скомпилировано в Eclipse:

List<?> foo = new ArrayList<Object>();
Collections.sort((List<Comparable>) foo);

Вы получите "Безопасность типа:Непроверенное" предупреждение, которое вы можете подавить с помощью этого:

@SuppressWarnings("unchecked")

Это позволит вам вызвать sort.Это то, что ты ищешь?Конечно, нет гарантий, что это будет безопасно во время выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top