Estaba leyendo una entrevista con Joshua Bloch en Coders at Work, donde lamentó la introducción de genéricos en Java 5. No le gusta la implementación específica en gran parte porque el soporte de varianza (comodines de Java) la hace innecesariamente compleja.C# generics - sin límites inferiores por diseño?
Por lo que sé, C# 3 no tiene nada que ver con los comodines explícitos y acotados, p. Ej. no puede declarar un método PriceBatch que toma un grupo de Asset o una subclase de activo (void PriceBatch(Collection<? extends Asset> assets)
en Java?).
¿Alguien sabe por qué los comodines y los límites no se han agregado a C#? ¿Se dejaron intencionalmente estas características para simplificar el lenguaje, o es algo que simplemente no han llegado a implementar todavía?
EDITAR: Holy smoke, ¡comentarios de Eric Lippert himself! Después de leer el suyo y comentarios interesantes de Pablo, me doy cuenta de que por lo menos se admiten límites superiores y que el ejemplo anterior se puede traducir a C# como:
void PriceBatch<T>(ICollection<T> assets) where T : Asset
Límites inferior, por el contrario, están aparentemente no soportado como Eric dice en su segundo comentario, por ejemplo probablemente no haya forma de traducir directamente este código Java (algo inventado) a 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);
¿Estoy en lo correcto? Si este es el caso, ¿hay alguna razón particular por la cual C# tiene límites superiores pero no menores?
No entiendo la pregunta; C# ha limitado los genéricos y desde C# 2. ¿Es lo que está obteniendo en Java que soporta * call-site * covarianza y contravarianza en los tipos genéricos construidos? Porque C# no es compatible con eso; C# 4 admitirá * la varianza del sitio de declaración *. –
¿O es lo que se obtiene con el hecho de que los límites de parámetros de tipo en los métodos genéricos son solo límites derivados y no deben derivarse de los límites? C# no es compatible con este último; Java y Scala creo. –
Gracias, he actualizado la pregunta. – ehnmark