Ich kompilierte statisch eine Java-Bibliothek, die Generics viel verwendete, wie Collection<?>
, aber die emittierte .NET-DLL verwendet nur Collection
, nicht mit Typ-Parameter. Woher?Unterstützt IKVM.net keine Generics (Typparameter)?
Antwort
Java-Generics werden vom Java-Compiler behandelt und zur Kompilierungszeit in eine nicht-generische Version konvertiert. Dies unterscheidet sich von .NET, wo die CLR erstklassige Unterstützung für Typparameter bietet. Auf der Bytecode-Ebene wird ArrayList<T>
nur eine einfache ArrayList
sein.
zu zitieren Java docs:
Generics implementiert werden durch den Java-Compiler als Conversion-Front-End Löschen genannt, was der Prozess des Übersetzens oder Umschreiben Code ist, dass Generika in nicht-generic-Code verwendet (das heißt, ordnet die neue Syntax der aktuellen JVM-Spezifikation zu). Mit anderen Worten, diese Konvertierung löscht alle generischen Typinformationen. Alle Informationen zwischen spitzen Klammern werden gelöscht. Zum Beispiel wird
LinkedList<Integer>
LinkedList
werden. Verwendungen anderer Typvariablen werden durch die Obergrenze der Typvariablen ersetzt (z. B.Object
). Wenn der resultierende Code nicht korrekt ist, wird eine Umwandlung in den entsprechenden Typ eingefügt.
- 1. C# Generics - Einschränkungen für Typparameter
- 2. Adodb unterstützt keine Sicherheitsverfahren?
- 3. Libcurl unterstützt keine HTTPS
- 4. Objekt unterstützt keine Methode
- 5. Klasse unterstützt keine Operatoren
- 6. Generische Klasse mit eingeschränktem Typparameter
- 7. Optionale Parameter für Typparameter?
- 8. Warum unterstützen Java Generics keine primitiven Typen?
- 9. Welcher Typ Sicherheit hätte verloren, hätten Generics die Untertypisierung unterstützt?
- 10. aktuelle Recordset unterstützt keine Lesezeichen
- 11. TypeError: str unterstützt keine Pufferschnittstelle
- 12. JUnit 4.9 unterstützt keine Annahmefehlermeldungen
- 13. 'Symbol' Objekt unterstützt keine Indizierung
- 14. Warum unterstützt OpenCL keine Rekursion?
- 15. dh keine "Includes" -Methode unterstützt
- 16. Browser unterstützt keine Frames Ausnahme
- 17. Warum unterstützt JSONPath keine Eltern?
- 18. New-PSDrive unterstützt keine Anmeldeinformationen?
- 19. Chrome unterstützt keine Box-Sizing?
- 20. Java: string.replace unterstützt keine Variablen?
- 21. Unterstützt Seaborn distplot keine Auswahl?
- 22. Generics, Überladungsauflösung und Delegierten
- 23. Fehlender Typparameter. Proguard?
- 24. scala Typparameter als Objekttyp
- 25. C# Typparameter Spezifikation
- 26. Abstrakte Typen versus Typparameter
- 27. Generics Listview Custom Control
- 28. Java Generics?
- 29. Warum unterstützt C# keine impliziten generischen Typen für Klassenkonstruktoren?
- 30. Generics und Herausforderungen auf dem Parser Vorderseite
Ich mag Java Generics aus diesem Grund nicht. Generika sollten ein Hauptmerkmal gewesen sein, aber stattdessen war es nicht viel mehr als syntaktischer Zucker, um zu vermeiden, dass man Objekte auf einen bestimmten Typ umwandelt. Zucker ist wunderbar, aber es hätte so viel mehr sein können. Mumble-Typen und so fügen Sie tatsächlich Wert hinzu, also ist es nicht alles schlecht. – Joren
@Joren, Sie sind unnötig streng auf Generika. Während das Löschen von Text sicherlich enttäuschend ist, sind Generika sicherlich eine deutliche Verbesserung gegenüber der Umwandlung von Object, da wir nun alle Kompilierzeitgarantien des Java-Typsystems mit unseren generalisierten Klassen haben können. – Falaina
Aber die generischen Informationen sind immer noch in der kompilierten Klassendatei als Metadaten verfügbar (sonst wäre 'javac' nicht in der Lage Generika zu prüfen). Konnte IKVM diese Informationen nicht verwenden? –