Ho ricompilato in modo statico una libreria Java che utilizzava generici molto, come Collection<?>
, ma la DLL emessa .NET utilizza solo Collection
, non con i parametri di tipo. Come mai?IKVM.net non supporta i generici (parametri di tipo)?
risposta
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.
- 1. Perché Java non supporta l'inferenza di tipo per i costruttori?
- 2. generici i parametri variadic
- 3. Forzare che i parametri generici Java siano dello stesso tipo
- 4. Generici Java: più parametri generici?
- 5. parametri vs. farmaci generici
- 6. C# generici sintassi di tipo più vincoli dei parametri
- 7. I generici aperti vincolati di tipo non funzionano con RegistrationBuilder
- 8. Metodi generici C#, parametri di tipo nel vincolo costruttore new()
- 9. parametri generici ridondanti
- 10. Informazioni sui generici Java. convenzioni dei parametri Tipo
- 11. Ritorno/parametri generici di Groovy Closure?
- 12. Tipi astratti/Tipo I parametri in Scala
- 13. Come utilizzare un tipo strutturale con parametri generici?
- 14. Generici Java con più parametri
- 15. L'email di tipo non supporta la selezione
- 16. Impossibile dedurre informazioni di tipo sufficienti su `_`; Annotazioni di tipo o binding di parametri generici obbligatori
- 17. Generici Swift che non conservano il tipo
- 18. Typescript TSX e parametri generici
- 19. Mockito: Verifica con parametri generici
- 20. tipo di controllo e generici
- 21. Come vengono compilati i parametri del modello non di tipo?
- 22. metodi generici tipo di inferenza
- 23. Ruby supporta l'hint di tipo?
- 24. generici Java - tipo dedurre
- 25. non-tipo di modello parametri di funzione
- 26. Come definire i vincoli su più parametri generici
- 27. Tipo controllo di una classe con i tipi generici
- 28. Unificare tipo e non di tipo parametri di modello
- 29. Il tipo 'int' non supporta l'operatore '=='
- 30. Aggiungere vincoli ai parametri generici in estensione
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
@ 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
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? –