È 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?
Ma questo ha un impatto negativo sull'utilizzo della memoria, perché c'è più codice, no? – yankee
Sì, è un compromesso. La memoria non è la risorsa più scarsa al giorno d'oggi però. – Esko
@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