Stavo leggendo un'intervista con Joshua Bloch in Coders at Work, dove si lamentava dell'introduzione di generici in Java 5. Non gli piace l'implementazione specifica, in gran parte perché il supporto della varianza, i caratteri jolly di Java, lo rende inutilmente complesso.Generici C#: senza limiti inferiori per progettazione?
Per quanto ne so, C# 3 non ha nulla come i caratteri jolly espliciti, limitati, ad es. non è possibile dichiarare un metodo PriceBatch che richiede una raccolta di asset o qualsiasi sottoclasse di asset (void PriceBatch(Collection<? extends Asset> assets)
in Java?).
Qualcuno sa perché i caratteri jolly e i limiti non sono stati aggiunti a C#? Queste funzioni sono state intenzionalmente tralasciate per rendere più semplice la lingua, oppure è qualcosa che non sono ancora state in grado di implementare?
MODIFICA: Santo fumo, commenti da Eric Lippert stesso! Dopo aver letto le sue e le osservazioni penetranti di Paolo, mi rendo conto che almeno sono supportati limiti superiori e che l'esempio di cui sopra può essere tradotto in C# come:
void PriceBatch<T>(ICollection<T> assets) where T : Asset
limiti più bassi, d'altra parte, sono a quanto pare non supportato come Eric dice nel suo secondo commento, ad es probabilmente non c'è modo di tradurre direttamente questo (un po 'forzato) codice Java in C#:
public class Asset {}
public class Derivative extends Asset {}
public class VanillaOption extends Derivative {}
public static <T extends Asset> void copyAssets(Collection<T> src, Collection<? super T> dst) {
for(T asset : src) dst.add(asset);
}
Collection<VanillaOption> src = new ArrayList<VanillaOption>();
[...]
Collection<Derivative> dst = new ArrayList<Derivative>();
[...]
copyAssets(src, dst);
Sono corretto? Se questo è il caso, c'è un motivo particolare per cui C# ha limiti superiori ma non inferiori?
Non capisco la domanda; C# ha limitato i generici e da allora C# 2. È quello che stai ottenendo che Java supporta * call-site * covarianza e controvarianza sui tipi generici costruiti? Perché C# non supporta questo; C# 4 supporterà la * dichiarazione-sito * varianza. –
O è ciò che si ottiene dal fatto che i limiti dei parametri di tipo sui metodi generici devono solo derivare dai limiti e non devono essere derivati dai limiti? C# non supporta quest'ultimo; Java e Scala credo. –
Grazie, ho aggiornato la domanda. – ehnmark