Es bien sabido que los tipos genéricos no sobreviven al proceso de compilación. Ellos son reemplazados por moldes de clase.¿Puede un JIT beneficiarse de los genéricos?
Pero, sin embargo, la información de tipo está presente en el archivo de clase y se puede ver utilizando la reflexión:
public class Demo
{
private List<String> list;
public Demo() throws SecurityException, NoSuchFieldException
{
System.out.println(((Class<?>)((ParameterizedType) getClass().getDeclaredField("list").getGenericType()).getActualTypeArguments()[0]).getName());
}
public static void main(String[] args) throws SecurityException, NoSuchFieldException
{
new Demo();
}
}
Cuando se ejecuta, esto imprimirá java.lang.String
.
¿Puede un JIT usar esto para algún tipo de optimización? ¿O es inútil esa información desde el punto de vista del JIT?
Pero eso tiene un impacto negativo en el uso de la memoria, porque hay más código, ¿no? – yankee
Sí, es una compensación. La memoria no es el recurso más escaso en la actualidad sin embargo. – Esko
@yankee Claro, pero las plantillas C++ sí tienen este problema desde el principio y hasta ahora les ha funcionado bien. Aunque eso también tiene que ver con algunas optimizaciones inteligentes (es decir, métodos que dan como resultado que se combine el mismo código de máquina), lo cual dudo que el compilador de Java lo haga (eso es un problema no trivial y javac es bastante simple) – Voo