Podría decir algunas buenas cosas sobre los genéricos, pero esa no era la pregunta. Podría quejarme de que no están disponibles en tiempo de ejecución y no funcionan con matrices, pero eso se ha mencionado.
Una gran molestia psicológica: ocasionalmente me meto en situaciones donde los genéricos no pueden funcionar. (Las matrices son el ejemplo más simple.) Y no puedo entender si los genéricos no pueden hacer el trabajo o si soy estúpido. Odio eso. Algo así como los genéricos deberían funcionar siempre. Cada vez que no puedo hacer lo que quiero usando Java-the-language, sé el problema soy yo, y sé que si sigo presionando, llegaré al final. Con los genéricos, si me vuelvo demasiado persistente, puedo perder mucho tiempo.
Pero el problema real es que los genéricos agregan demasiada complejidad por muy poca ganancia. En los casos más simples, puede evitar que agregue una manzana a una lista que contiene autos. Multa. Pero sin los genéricos, este error generaría una ClassCastException realmente rápida en el tiempo de ejecución con poco tiempo perdido. Si agrego un automóvil con un asiento para niños con un niño en él, ¿necesito una advertencia en tiempo de compilación de que la lista es solo para los automóviles con asientos para niños que contienen chimpancés bebés? Una lista de instancias de objetos simples comienza a parecer una buena idea.
El código genérico puede tener muchas palabras y caracteres, ocupa mucho espacio adicional y demora mucho más en leer. Puedo pasar mucho tiempo haciendo que todo ese código extra funcione correctamente. Cuando lo hace, me siento increíblemente inteligente. También he perdido varias horas o más de mi tiempo y me pregunto si alguien más podrá averiguar el código. Me gustaría poder entregarlo para el mantenimiento a personas que son menos inteligentes que yo o que tienen menos tiempo para perder.
Por otra parte, (tengo un poco de nervios y siento la necesidad de proporcionar algo de equilibrio), es agradable cuando se usan colecciones y mapas simples para agregar, poner y verificar cuando está escrito, y generalmente no agrega mucha complejidad al código (if alguien else escribe la colección o el mapa) . Y Java es mejor en esto que C #. Parece que ninguna de las colecciones de C # que quiero usar nunca maneja genéricos. (Admito que tengo gustos extraños en las colecciones).