Domanda

Mi chiedo se sia possibile eseguire il cast di un non comparabile con qualcosa in modo che corrisponda al parametro del metodo T che ha il tipo di modello <T extends Comparable<? super T>>, come il Collections.sort() metodo

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

Supponiamo di avere da qualche parte un riferimento all'elenco di non comparabili e di voler invocare quel metodo lanciando in questo modo:

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

Posso farlo se lancio a (List<? extends Comparable>), ma questo genera un avviso che sto utilizzando tipi grezzi (comparabili senza tipi di modello in questo caso).Diciamo che voglio evitare di usare i tipi raw o addirittura di sopprimerli tramite @SuppressWarnings("rawtypes") (per esempio.per preservare la compatibilità con le versioni precedenti ed evitare i tipi grezzi).

È possibile evitare l'uso di tipi grezzi eseguendo il casting to (List<? extends Comparable</*something*/>>) e quale sarebbe quel "qualcosa" (il cast non controllato è accettabile)?

MODIFICARE:Questo esempio è solo per illustrare il punto.In realtà non ho un comparabile né voglio ordinare nulla, ma devo solo verificare dinamicamente se qualcosa è di qualche tipo (comparabile in questo esempio) (tramite istanza di) e quindi passare qualche argomento a un metodo che ha argomenti modello simile al Collections.sort() metodo.

È stato utile?

Soluzione

Trasmettilo a

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

Ciò non fornirà avvisi "rawtype".Solo un avviso di "lancio non controllato" (che riceverai comunque).

A giudicare da quanto hai menzionato nel MODIFICARE, alla fine vuoi fare qualcosa del genere?

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

Altri suggerimenti

Questo non è certamente possibile. Collections.sort richiede il Comparable per chiamare il compareTo() metodo.Quindi, secondo te, cosa dovrebbe succedere quando sort ottiene una raccolta di oggetti non comparabili?

Potrebbe darsi che tu voglia utilizzare qualcosa come un ordinamento predefinito, basato ad esempio sui riferimenti.Ma una cosa del genere non esiste implicitamente.Tuttavia, può essere implementato.Ma dubito che sia questo quello che vuoi?Allora perché vuoi ordinare l'elenco in primo luogo?E come dovrebbero essere ordinati questi elementi?

Questo verrà compilato in Eclipse:

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

Riceverai un "Tipo di sicurezza:Unchecked" avviso che puoi eliminare con questo:

@SuppressWarnings("unchecked")

Ciò ti consentirà di chiamare sort.E' questo quello che stai cercando?Nessuna garanzia che sarà sicuro in fase di esecuzione, ovviamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top