Ad esempio, controlla il metodo in java.util.Collections
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
Perché posso definirlo in questo modo:
public static <T> int binarySearch(List<T> list, T key, Comparator<T> c)
Perché questo non funzionerà in java?
risposte:
14 per risposta № 1tu poteva definiscilo in quel modo, ma non ti permetterebbe di cercare a List<Circle>
usare un Comparator<Shape>
, per esempio.
Fondamentalmente, la varianza che viene espressa qui consente una maggiore flessibilità pur mantenendo la sicurezza del tipo.
0 per risposta № 2
Per amplificare Jon Skeet"La risposta è un po ', i generici di Java non sono come il C ++modelli. Alcune delle decisioni di progettazione (come la cancellazione del tipo) per i generici, fatte per la compatibilità a ritroso della stessa JVM, portano a una sintassi impacciata e a casi d'uso complicati. Puoi leggere di alcuni di questi qui.