Stavo leggendo una discussione sui modelli C++ e sui generici C# e su come sono diversi dai generici cancellati dal tipo di Java. Ho letto una dichiarazione che diceva che Java utilizza ancora la fusione in fase di runtime, ad esempio quando si tratta di raccolte. Se questo è vero, non ne ero consapevole!Quando i generici di Java usano il cast in fase di runtime?
Diciamo che ho codice come:
ArrayList<SomeClass> list = new ArrayList<SomeClass>();
...
SomeClass object = list.get(0);
La mia domanda è. È efficacemente compilato per
ArrayList list = new ArrayList();
...
SomeClass object = (SomeClass) list.get(0);
Se sì, perché? Ho pensato che il fatto che la lista sia di tipo ArrayList<SomeClass>
garantisce, al momento della compilazione e del tempo di esecuzione, che solo SomeClass sarà memorizzato all'interno di ArrayList? O puoi mai fare casting di tipo non sicuro per trasformare uno ArrayList<OtherClass>
in uno ArrayList<SomeClass>
?
Ci sono altre occasioni in cui il cast di tipo at-runtime viene eseguito in generici Java?
Infine, se si utilizza effettivamente il lancio in fase di esecuzione, ci sono occasioni in cui il JIT può elidere il controllo del tempo di esecuzione?
(Si prega di astenersi dal rispondere/commentare che le micro-ottimizzazioni non ne valgono la pena, l'ottimizzazione preventiva è la radice di tutto il male, ecc. Le vedo su altre domande simili.Questi punti sono ben compresi, ma non portano via il punto di cercare di capire come i generici cancellati dal tipo sono implementati sotto il cofano.)
Hai un sacco di domande. Ma la risposta arriva a questo: Java Generics è stato messo in atto per migliorare il controllo degli errori in fase di compilazione – ControlAltDel
Questo è praticamente coperto dalle varie informazioni e tutorial di Generics fornite da Oracle (Sun). Per mantenere la retrocompatibilità, i generici sono stati imbullati come funzionalità di compilazione. http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf –
Le risposte di SLaks, Richante e Adriano mi stavano chiarendo. La linea di fondo è ciò che @ user1291492 menzionato, i generici ci sono principalmente per il controllo degli errori in fase di compilazione. È ancora un po 'oscuro ciò che fa il JIT. E mi sembra ancora che tu possa ottimizzare i controlli di runtime se la semantica di Java non consente conversioni non sicure (come 'ArrayList' in 'ArrayList ') ma questo è un argomento per un'altra domanda. Scelgo la risposta di Richante come "corretta", per lo sforzo di compilazione e disassemblaggio (grazie!). –
Max