Según tengo entendido, C# y java difieren con respecto a los genéricos en algunos aspectos, uno de los cuales es que los parámetros de tipo genérico están disponibles en tiempo de ejecución en C#/.NET pero no en Java. ¿Por qué los diseñadores del lenguaje Java lo hicieron de esta manera?¿Por qué no se reifican los parámetros de tipo genérico de Java en tiempo de ejecución?
Respuesta
Para permitir la compatibilidad binaria con bytecode pre-genéricos, lo que permite que el nuevo código interactúe con el código anterior.
Desde la página Type Erasure de los tutoriales de Java:
Tipo borrado permite que las aplicaciones Java que utilizan genéricos para mantener compatibilidad binaria con las bibliotecas de Java y aplicaciones que se crearon antes genéricos.
[...] existe
Tipo borrado de manera que el nuevo código puede continuar para interactuar con el código heredado .
Para una pregunta relacionada, eche un vistazo a C# vs Java generics.
recuerdo haber leído algo acerca de esto en el libro de Java Hardcore:
El problema con los elementos en comprobar una colección en tiempo de ejecución es que es extremadamente caro ; el orden de eficacia es solo O (n). Si tiene solo 10 direcciones en su colección, elementos de verificación es fácil. Sin embargo, si la colección contiene 15,000 direcciones, entonces incurriría en una sobrecarga significativa cada vez que alguien llama al colocador.
Por otro lado, si se puede evitar que los usuarios colocar que no sea una dirección nada en su colección en tiempo de compilación, entonces no tendría que comprobar los tipos en tiempo de ejecución . Si intentan darle algo que no es una dirección, entonces el compilador rechazará el intento. Esto es exactamente lo que hacen los tipos parametrizados.
Sin embargo, "por qué" nunca puede realmente ser contestadas de manera satisfactoria, porque hay demasiadas variables involucradas con la gente, el tiempo, el lugar y la política. Recuerdo haber leído en otro lado que la decisión tenía mucho que ver con mantener la compatibilidad con la forma en que se estaban haciendo las cosas en el código de bytes de Java. Aquí hay otra cita del mismo libro:
Después de que el compilador haya resuelto el tipo de seguridad introducido por los genéricos, borra la parametrización del tipo. Por lo tanto, la información no está disponible en tiempo de ejecución. El propósito del borrado, según lo establecido por Sun, es permitir que las bibliotecas de clases construidas con una versión anterior del JDK puedan ejecutarse en la máquina virtual JDK 1.5.
Tengo curiosidad, ¿cuáles son las ventajas que ofrecen los genéricos en tiempo de ejecución?
- 1. ¿Por qué no se borran todos los tipos de información en Java en tiempo de ejecución?
- 2. Build C# Definición de tipo genérico en tiempo de ejecución
- 3. Crear tipo genérico con interfaz genérica en tiempo de ejecución
- 4. C# Creando un tipo genérico desconocido en tiempo de ejecución
- 5. ¿Cómo obtener el tipo genérico en tiempo de ejecución?
- 6. parámetros de tipo genérico circular
- 7. ¿Por qué este código java genérico no se compilará?
- 8. Java Variables de tipo genérico
- 9. ¿Sobrecarga de parámetros de tipo genérico no permitidos?
- 10. ¿Por qué los parámetros de tipo genérico C# infringen la covarianza?
- 11. ¿Por qué no se puede convertir este tipo genérico?
- 12. ¿Por qué no pueden los parámetros de tipo de plantilla no ser del tipo de clase
- 13. Java Instantiate clase en tiempo de ejecución con parámetros
- 14. ¿Por qué no puedo crear una matriz de tipo genérico?
- 15. ¿El orden de ejecución de los parámetros garantiza en Java?
- 16. acceder a información de tipo con parámetros en tiempo de ejecución
- 17. ¿Por qué Scala no infiere completamente los parámetros de tipo cuando los parámetros de tipo están anidados?
- 18. DynamicMethod con parámetros de tipo genérico
- 19. Nombre de clase de los parámetros de tipo en java?
- 20. ¿Por qué son los parámetros de función de tipo size_t?
- 21. ¿Qué pasa con los parámetros de tipo genérico opcionales en C# 5.0?
- 22. Java argumentos de tipo genérico
- 23. No se puede inferir el tipo genérico con los parámetros opcionales
- 24. C#: Obtener parámetro de tipo en tiempo de ejecución a pasar a un método genérico
- 25. ¿Por qué no se debe modificar la configuración de django en el tiempo de ejecución?
- 26. ¿Por qué no se compila Node.js antes del tiempo de ejecución?
- 27. de tipo no Parámetros
- 28. Especificación de tipo genérico de la colección parámetro en tiempo de ejecución
- 29. ¿Por qué los tipos de parámetros contravariantes en Java no están permitidos para la anulación?
- 30. función que devuelve un tipo genérico cuyo valor es conocido sólo en tiempo de ejecución