¿Cómo se puede mejorar Java para que ya no necesite realizar borrado de tipo?

16

El tutorial oficial de Java sobre genéricos explica la eliminación de tipos y por qué se agregó al compilador:

Cuando se crea una instancia de un tipo genérico, el compilador traduce esos tipos mediante una técnica llamada borrado de tipo, un proceso en el que el compilador elimina toda la información relacionada con los parámetros de tipo y los argumentos de tipo dentro de una clase o método. El borrado de tipos permite que las aplicaciones Java que usan genéricos mantengan la compatibilidad binaria con las bibliotecas y aplicaciones Java que se crearon antes que los genéricos.

Probablemente fue un enfoque pragmático, o quizás el menos doloroso. Sin embargo, ahora que los genéricos son ampliamente compatibles en toda la industria, ¿qué se puede hacer para que no necesitemos borrado de tipo? ¿Es factible sin necesidad de romper la compatibilidad con versiones anteriores, o si es factible, es práctico?

¿La última declaración en la cita anterior se ha vuelto autorreferencial? Es decir: "la eliminación de tipos permite que las aplicaciones Java que usan genéricos mantengan la compatibilidad binaria con las bibliotecas y aplicaciones Java que se crearon con versiones de Java que realizan la eliminación de tipos".

un usuario
fuente
1
El Sun 1.4 fue EOL'ed. IBM todavía admite 1.4 en sus plataformas.
@ ThorbjørnRavnAndersen: Y al menos para la plataforma que se encuentra en el sótano de mi padre, no hay 1.5.
Jörg W Mittag
@ ThorbjørnRavnAndersen No solo eso, sino que también se puede comprar soporte extendido para versiones mucho más antiguas de la JVM. Lo último que escuché es que es bastante caro.
maple_shaft
1
Ninguno de nosotros posee una bola de cristal, por lo tanto, no es responsable. Tal vez se pueda volver a abrir si reformula la pregunta de una pregunta "¿Alguna vez habrá ..." a una pregunta "Qué se debe lograr para que Type Erasure se realice en una versión futura de Java"
maple_shaft
@ JörgWMittag ¿sería una plataforma realmente utilizada para la producción en 2012?

Respuestas:

7

El final de la vida útil se aplica al Java Development Toolkit y al Java Runtime Environment. Y solo las versiones de Oracle (Sun). Pero no se aplica a las solicitudes escritas por terceros. La intención es nunca romper el código que se ha ejecutado en la JVM, por lo tanto, es poco probable que Java deje de hacer borrado de tipo.

Por supuesto, C # también introdujo genéricos en versiones posteriores de manera compatible con versiones anteriores sin borrar el tipo, pero básicamente significaba duplicar todas las clases de colección. Lo que supongo es lo que los diseñadores de Java no quieren hacer y, por lo tanto, por qué eligieron el tipo de borrado en primer lugar. Sin tipos de valor, la ventaja de los genéricos sin borrado de tipo no es tan grande.

Jan Hudec
fuente
66
El equipo de OpenJDK ha discutido la posibilidad de analizar los genéricos reificados nuevamente, ¿el plazo? Lo más probable es que se considere seriamente durante el período de tiempo de Java 9 y, si es técnicamente factible, se entregará en el período de tiempo de Java 10. Pero esto es un serio adivino de mi parte.
Martijn Verburg
La eliminación de tipo la realiza el compilador, no la JVM. La introducción de genéricos reificados requeriría un nuevo compilador y una nueva JVM, pero presumiblemente aún funcionarían con código antiguo.
Gabe
@Gabe: Obviamente, se presentarían en una nueva versión, por lo que habría un nuevo compilador y una nueva JVM. Pero también requiere duplicar una parte importante de la biblioteca estándar, ya que necesitaría versiones genéricas para el nuevo código y versiones no genéricas para la compatibilidad con versiones anteriores. .NET hizo exactamente eso en la versión 2.0, Java lo evitó con borrado. .NET tiene tipos de valor (estructura) y el soporte de primera clase para ellos impide el borrado de tipos. Java no lo hace, por lo que la presión por los genéricos reificados es mucho menor.
Jan Hudec
Jan: Estaba comentando el hecho de que reificar los genéricos no significa automáticamente que todo el código antiguo esté roto. También agregaría que a List<int>probablemente haría que las cargas de trabajo sean mucho más eficientes que las actuales List<Integer>.
Gabe
@ Gabe: No estamos en desacuerdo en eso. Solo quería señalar el principal inconveniente.
Jan Hudec