Es comúnmente aceptado que los genéricos de Java fallaron de algunas maneras importantes. La combinación de comodines y límites condujo a un código seriamente ilegible.
Sin embargo, cuando miro otros idiomas, realmente parece que no puedo encontrar un sistema de tipo genérico con el que los programadores estén contentos.
Si tomamos lo siguiente como objetivos de diseño de un sistema de este tipo:
- Siempre produce declaraciones de tipo fácil de leer
- Fácil de aprender (no es necesario repasar la covarianza, la contravarianza, etc.)
- maximiza el número de errores en tiempo de compilación
¿Hay algún idioma que lo haya entendido bien? Si busco en Google, lo único que veo son quejas sobre cómo el sistema de tipos es un asco en el lenguaje X. ¿Es este tipo de complejidad inherente a la escritura genérica? ¿Deberíamos renunciar a intentar verificar la seguridad del tipo al 100% en tiempo de compilación?
Mi pregunta principal es cuál es el lenguaje que "acertó" mejor con respecto a estos tres objetivos. Me doy cuenta de que eso es subjetivo, pero hasta ahora ni siquiera puedo encontrar un lenguaje en el que no todos sus programadores estén de acuerdo en que el sistema de tipos genéricos es un desastre.
Anexo: como se señaló, la combinación de subtipo / herencia y genéricos es lo que crea la complejidad, por lo que realmente estoy buscando un lenguaje que combine ambos y evite la explosión de la complejidad.
Foo<T> where SiameseCat:T
) y que no hay posibilidad de tener un tipo genérico que no sea convertible Object
. En mi humilde opinión, .NET se beneficiaría de los tipos agregados que eran similares a las estructuras, pero aún más deshuesados. Si se KeyValuePair<TKey,TValue>
tratara de un tipo de este tipo, se IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
podría emitir un IEnumerable<KeyValuePair<Animal,Vehicle>>
, pero solo si el tipo no se puede encuadrar.
easy-to-read type declarations
? El tercer criterio también es ambiguo: por ejemplo, puedo convertir las excepciones fuera de límites del índice de matriz en errores de tiempo de compilación al no permitirle indexar matrices a menos que pueda calcular el índice en tiempo de compilación. Además, el segundo criterio descarta el subtipo. Eso no es necesariamente algo malo, pero debes saber lo que estás preguntando.