// 0
public static <T extends Comparable<? super T>> void sort0(List<T> list)
// 1
public static <T extends Comparable<T>> void sort1(List<? extends T> list)
Queste firme differiscono in quanto impongono requisiti diversi sul rapporto tra tipo T
e il tipo argomento per Comparable
nella definizione di T
.
Supponiamo per esempio di avere questa classe:
class A implements Comparable<Object> { ... }
Quindi se avete
List<A> list = ... ;
sort0(list); // works
sort1(list); // fails
La ragione sort1
non è che non c'è non tipo T
che sia paragonabile a se stesso e cioè, o è un supertipo di, il tipo della lista.
Si scopre che la classe A
non è valida, poiché gli oggetti che sono Comparable
devono soddisfare determinati requisiti. In particolare, invertire il confronto dovrebbe invertire il segno del risultato. Possiamo confrontare un'istanza di A
in un Object
ma non viceversa, quindi questo requisito è violato. Tuttavia, si noti che questo è un requisito della semantica di Comparable
e non è imposto dal sistema di tipi. Considerando solo il sistema di tipi, le due dichiarazioni sort
sono davvero diverse.
fonte
2016-03-01 08:40:25
Ma come funziona statico> T max (Collection extends T> c) funziona bene ... si tratta ancora di un problema di inferenza? –
prvn
@prvn, qui hai 'Comparabile super T>' invece di 'Comparabile' come nella tua firma proposta. '> void sort (Lista extends T>)' funzionerebbe anche, ma aggiungendo '? Estende T' è completamente inutile qui, mentre ragionevole nel metodo 'max' (come' max' restituisce il valore). –
C'è un altro punto. Quando si ha un tipo jolly come 'Lista extends T> lista' non si può fare' list.set (index, list.get (anotherIndex)) 'all'interno del metodo, a causa del funzionamento dei tipi di caratteri jolly. Questo può essere aggirato con un metodo di supporto interno che cattura '? estende T' in un'altra variabile di tipo (o usando operazioni non controllate come spesso fanno le implementazioni interne), ma ancora, un tipo senza caratteri jolly è più pulito per un elenco che verrà modificato. – Holger