2011-07-27 6 views
8

È noto che i tipi generici non sopravvivono al processo di compilazione. Sono sostituiti da calchi di classe.Una JIT può beneficiare di Generics?

Ma tuttavia, le informazioni sul tipo è presente nel file di classe e possono essere visti utilizzando la riflessione:

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(); 
    } 
} 

Quando viene eseguito, questo stampa java.lang.String.

Può un JIT utilizzare questo per qualche tipo di ottimizzazione? O quell'informazione dal punto di vista del JIT è inutile?

risposta

3

Potrebbe, ma per quanto ne so non lo è. Per ovviare a questo, Scala ha aggiunto un po 'di recente il supporto per compilare il codice type specialization di codice generico che genera versioni specializzate della classe, senza alcun cast, e li posiziona in modo trasparente sul resto della base di codici in modo che il codice funzioni ancora come previsto. In questi casi, il codice Scala compilato può essere notevolmente più veloce di Java poiché Java con Generics utilizzerà sempre cast.

+0

Ma questo ha un impatto negativo sull'utilizzo della memoria, perché c'è più codice, no? – yankee

+0

Sì, è un compromesso. La memoria non è la risorsa più scarsa al giorno d'oggi però. – Esko

+0

@yankee Certo, ma i modelli C++ hanno questo problema da sempre e finora ha funzionato bene per loro. Anche se questo ha a che fare con alcune intelligenti ottimizzazioni (cioè i metodi che portano allo stesso codice macchina sono combinati), che dubito del compilatore Java (questo è un problema non banale e javac è piuttosto semplice) – Voo

2

Non è possibile che JVM eviti il ​​casting dell'oggetto poiché la raccolta sottostante potrebbe non avere Stringhe. per esempio. se si usa la cancellazione per aggiungere un intero alla lista.

Non riesco a pensare ad una potenziale ottimizzazione e ci sono molte potenzialità di ottimizzazione che il JIT non fa. ;)