Обобщения Java: Как привести к (T расширяет Comparable <? Super T>) без необработанных типов - PullRequest
4 голосов
/ 16 февраля 2011

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

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

Приведите его к

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);
}
1 голос
/ 16 февраля 2011

Это скомпилируется в Eclipse:

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

Вы получите предупреждение «Безопасность типов: не проверено», которое можно подавить следующим образом:

@SuppressWarnings("unchecked")

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

1 голос
/ 16 февраля 2011

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

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

...