2011-07-27 16 views
8

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?

Respuesta

3

Podría, pero hasta donde yo sé, no es así. Para solucionar este problema, Scala agregó soporte hace poco tiempo de compilación en tiempo type specialization de código genérico que genera versiones especializadas de la clase, sin ningún molde, y los coloca en el resto de la base de código de forma transparente para que el código funcione como se esperaba. En estos casos, el código Scala compilado puede ser notablemente más rápido que Java, ya que Java con Generics siempre usará moldes.

+0

Pero eso tiene un impacto negativo en el uso de la memoria, porque hay más código, ¿no? – yankee

+0

Sí, es una compensación. La memoria no es el recurso más escaso en la actualidad sin embargo. – Esko

+0

@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

2

No es posible que la JVM evite enviar el objeto, ya que la colección subyacente puede no tener cadenas. p.ej. si se usa borrado para agregar un entero a la lista.

No puedo pensar en una posible optimización y hay muchas posibilidades de optimización que el JIT no hace. ;)