Come si può migliorare Java in modo che non sia più necessario eseguire la cancellazione del tipo?


16

Il tutorial ufficiale di Java sui generici spiega la cancellazione dei tipi e perché è stato aggiunto al compilatore:

Quando viene istanziato un tipo generico, il compilatore traduce quei tipi con una tecnica chiamata type erasure, un processo in cui il compilatore rimuove tutte le informazioni relative ai parametri del tipo e agli argomenti del tipo all'interno di una classe o di un metodo. La cancellazione del tipo abilita le applicazioni Java che usano i generici per mantenere la compatibilità binaria con le librerie e le applicazioni Java create prima dei generici.

Questo molto probabilmente era un approccio pragmatico, o forse il meno doloroso. Tuttavia, ora che i farmaci generici sono ampiamente supportati in tutto il settore, cosa si può fare per non aver bisogno della cancellazione del tipo? È fattibile senza la necessità di rompere la compatibilità all'indietro, o se è fattibile, è pratico?

L'ultima affermazione nella citazione sopra è diventata autoreferenziale? Vale a dire: "la cancellazione del tipo consente alle applicazioni Java che usano i generici di mantenere la compatibilità binaria con le librerie Java e le applicazioni create con versioni Java che eseguono la cancellazione del tipo".


1
The Sun 1.4 è stato EOL. IBM supporta ancora 1.4 sulle loro piattaforme.

@ ThorbjørnRavnAndersen: E almeno per la piattaforma che si trova nel seminterrato di mio padre, non c'è 1.5.
Jörg W Mittag,

@ ThorbjørnRavnAndersen Non solo, ma è possibile acquistare un supporto esteso anche per versioni molto precedenti di JVM. L'ultima volta che ho sentito dire che è piuttosto costoso.
maple_shaft

1
Nessuno di noi qui possiede una sfera di cristallo, quindi non è responsabile. Forse può essere riaperto se riformuli la domanda da una domanda "Ci sarà mai ..." a una "Cosa deve essere realizzato affinché la cancellazione del tipo venga eseguita in una versione futura di Java"
maple_shaft

@ JörgWMittag sarebbe una piattaforma effettivamente utilizzata per la produzione nel 2012?

Risposte:


7

La fine del ciclo di vita si applica a Java Development Toolkit e Java Runtime Environment. E solo le versioni Oracle (Sun). Ma non si applica alle domande scritte da terzi. L'intenzione è quella di non rompere mai il codice mai eseguito sulla JVM, quindi è improbabile che Java smetta mai di cancellare i tipi.

Naturalmente C # ha anche introdotto i generici nella versione successiva in modo compatibile con le versioni precedenti senza cancellare i tipi, ma in pratica significava duplicare tutte le classi di raccolta. Il che suppongo sia ciò che i designer Java non vogliono fare e quindi perché hanno scelto la cancellazione del tipo in primo luogo. Senza i tipi di valore, il vantaggio dei generici non cancellati non è così grande.


6
Il team di OpenJDK ha discusso guardando nuovamente a Generics reificato, i tempi? È molto probabile che vengano esaminati seriamente durante il lasso di tempo di Java 9 e, se tecnicamente fattibile, consegnato nel lasso di tempo di Java 10. Ma questo è un grave indizio da parte mia.
Martijn Verburg,

La cancellazione del tipo viene eseguita dal compilatore, non dalla JVM. L'introduzione di generici reificati richiederebbe un nuovo compilatore e una nuova JVM, ma presumibilmente funzionerebbero ancora con il vecchio codice.
Gabe,

@Gabe: Ovviamente sarebbero stati introdotti nella nuova versione, quindi ci sarebbero stati nuovi compilatori e nuove JVM. Ma richiede anche la duplicazione di una parte significativa della libreria standard, perché avrebbe bisogno di versioni generiche per il nuovo codice e versioni non generiche per la compatibilità con le versioni precedenti. .NET ha fatto proprio questo nella versione 2.0, Java lo ha evitato con la cancellazione. .NET ha tipi di valore (struct) e il supporto di prima classe per loro impedisce la cancellazione dei tipi. Java no, quindi la pressione per i generici reificati è molto più piccola.
Jan Hudec,

Jan: Stavo solo commentando il fatto che reificare i generici non significa automaticamente che tutto il vecchio codice è rotto. Vorrei anche aggiungere che List<int>probabilmente renderebbe i carichi di lavoro molto più efficienti di quelli attuali List<Integer>.
Gabe,

@Gabe: Non siamo in disaccordo in questo. Volevo solo notare il principale svantaggio.
Jan Hudec,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.