2009-09-25 12 views

risposta

5

I generici Java vengono gestiti dal compilatore Java e convertiti in versione non generica in fase di compilazione. Questo è diverso da .NET dove CLR ha il supporto di prima classe per i parametri di tipo. Al livello bytecode, ArrayList<T> sarà semplicemente un ArrayList.

Per citare Java docs:

generici sono implementati dal compilatore Java come conversione front-end chiamato cancellazione, che è il processo di traduzione e riscrittura codice che utilizza generici in codice non generico (cioè, associa la nuova sintassi alla specifica JVM corrente). In altre parole, questa conversione cancella tutte le informazioni di tipo generico; tutte le informazioni tra parentesi angolari vengono cancellate. Ad esempio, LinkedList<Integer> diventerà LinkedList. Gli usi di altre variabili di tipo vengono sostituiti dal limite superiore della variabile di tipo (ad esempio, Object) e quando il codice risultante non è corretto, viene inserito un cast per il tipo appropriato.

+4

Non mi piacciono i generici Java per questo motivo. Generics avrebbe dovuto essere una caratteristica importante, ma invece non era molto più dello zucchero sintattico per evitare di lanciare 'object's su un tipo specifico. Lo zucchero è meraviglioso, ma avrebbe potuto essere molto di più. I tipi mumble e quindi effettivamente aggiungono valore, quindi non è affatto male. – Joren

+1

@ Joen, sei inutilmente duro con i farmaci generici. Mentre la cancellazione dei tipi è sicuramente deludente, i generici sono certamente un chiaro passo in avanti rispetto al dover eseguire il cast da Object poiché ora siamo in grado di avere tutte le garanzie in fase di compilazione del sistema di tipi Java con le nostre classi generiche. – Falaina

+3

Ma le informazioni generiche sono ancora disponibili nel file di classe compilato come metadati (altrimenti 'javac' non sarebbe in grado di controllare i generici). Non è possibile che IKVM utilizzi queste informazioni? –

Problemi correlati