Pregunta

Me pregunto si es posible emitir un elemento no comparable a algo que coincida con el parámetro del método T que tiene un tipo de plantilla. <T extends Comparable<? super T>>, como el Collections.sort() método

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

Supongamos que en algún lugar tengo una referencia a una lista de no comparables y quiero invocar ese método emitiendo algo así:

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

Puedo hacer esto si lanzo a (List<? extends Comparable>), pero esto genera una advertencia de que estoy usando tipos sin formato (comparable sin tipos de plantilla en este caso).Digamos que quiero evitar el uso de tipos sin formato o incluso suprimirlos mediante @SuppressWarnings("rawtypes") (p.ej.para preservar la compatibilidad con versiones anteriores y evitar tipos sin formato).

¿Es posible evitar el uso de tipos sin procesar emitiendo a (List<? extends Comparable</*something*/>>) ¿Y qué sería ese "algo" (el reparto sin control es aceptable)?

EDITAR:Este ejemplo es sólo para ilustrar el punto.En realidad, no tengo un Comparable ni quiero ordenar nada, pero solo necesito verificar dinámicamente si algo es de algún tipo (Comparable en este ejemplo) (a través de instancia de) y luego pasar algún argumento a un método que tenga argumentos de plantilla. Similar a Collections.sort() método.

¿Fue útil?

Solución

Emitirlo a

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

Esto no dará advertencias de "tipo sin formato".Sólo una advertencia de "transmisión no marcada" (que recibirá de todos modos).

A juzgar por lo que mencionaste en el EDITAR, ¿Al final quieres hacer algo como esto?

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

Otros consejos

Ciertamente esto no es posible. Collections.sort requiere el Comparable para poder llamar al compareTo() método.Entonces, en su opinión, ¿qué debería suceder cuando sort sea una colección de objetos no comparables?

Es posible que desee utilizar algo así como un orden predeterminado, basado en las referencias, por ejemplo.Pero tal cosa no existe implícitamente.Sin embargo, se puede implementar.¿Pero dudo que esto sea lo que quieres?Entonces, ¿por qué quieres ordenar la lista en primer lugar?¿Y cómo deberían clasificarse estos elementos?

Esto se compilará en Eclipse:

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

Obtendrá un "Tipo de seguridad:Advertencia "sin marcar" que puedes suprimir con esto:

@SuppressWarnings("unchecked")

Eso te permitirá llamar a ordenar.¿Es eso lo que estás buscando?Por supuesto, no hay garantías de que sea seguro en tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top