Wie ich sie verstehe, Generics sind eine Kompilierzeit Feature von Java, und parametrisierten Typ Informationen existiert nicht im kompilierten Byte-Code. Ich habe nun die Methoden getGenericType und getGenericReturnType entdeckt und damit meine Weltansicht zerstört. Bitte hilf mir, es zusammenzufügen.Java-Typ löschen vs. Feld # getGenericType und Methode # getGenericReturnType
Antwort
Wenn Sie in Ihrer IDE mit einem Array von kompiliertem Bytecode arbeiten, können Sie dennoch eine generische automatische Vervollständigung erhalten. So ist es implementiert. Grundsätzlich haben Sie Recht: Typen werden nicht vollständig gelöscht.
Die gerade Laufzeittypen von Objekten werden gelöscht. Zum Beispiel:
Object obj = new ArrayList<String>();
obj.getClass()
wird ArrayList.class
zurück. Sie können sogar sagen, dass ArrayList
einen generischen Parameter hat. Aber es gibt keine Möglichkeit zu sagen, ob obj
als ArrayList<String>
, ArrayList<Integer>
, ArrayList<Object>
, ArrayList
(roh) oder irgendetwas anderes erstellt wurde.
Statische Informationen sind immer noch für Klassen, Methoden usw. vorhanden (allerdings nicht für Einheimische). Dies ist nur ein zusätzliches Datenelement, das als Attribute in der Klassendatei angehängt und zur Laufzeit verfügbar ist. Stellen Sie sich das ähnlich wie Annotationen mit Laufzeitbeibehaltung vor. Gab es eine Frage?
Statische generische Typinformationen für Felder und Methoden müssen in der kompilierten Klassendatei vorhanden sein, damit der Compiler beim Kompilieren anderer Quellcodes die Typüberprüfung durchführen kann. Wenn Sie beispielsweise Code schreiben, der eine Variable vom Typ ArrayList<E>
verwendet, und eine get()
-Methode aufrufen, verfügen Sie nicht über den Quellcode für die Klasse ArrayList
. Der Compiler geht und betrachtet die kompilierte Klassendatei und ruft den generischen Rückgabetyp der get()
-Methode ab, und erkennt, dass es den generischen Typ E
zurückgibt, so dass es Typprüfung durchführen kann. Daher müssen die generischen Typinformationen vorhanden sein, damit der Compiler sie überprüfen kann.
- 1. Löschen vs Operator löschen (und void Zeiger)
- 2. Falsche Ausgabe mit getGenericReturnType auf Java 8
- 3. Feld vs. Methode in C++ Klasse std :: numeric_limits
- 4. löschen vs löschen [] -Operatoren in C++
- 5. Mysql Leistung: Löschen vs Löschen + Optimieren
- 6. vs Eigenschaft vs Methode erhalten
- 7. löschen vs NULL vs frei in C++
- 8. Ersetzen/Löschen Feld sqlalchemy mit
- 9. Task.WaitAll-Methode vs Parallel.Invoke-Methode
- 10. Django Serializer Methode Feld
- 11. ForeignKey vs OneToOne Feld django
- 12. Spring JpaRepostory löschen vs deleteInBatch
- 13. NHibernate Session.Flush & Evict vs Löschen
- 14. Rest API Mongoose Subdocument Löschen vs PUT
- 15. loadView Vs init Methode
- 16. Generics vs. Methode Overloading
- 17. Override vs Methode versteckt
- 18. SQL wo Feld in vs. wo Feld = mit mehreren oder?
- 19. Golang - JSON-Feld auf Null gesetzt vs Feld nicht
- 20. Feld löschen mit curl in couchdb
- 21. Unterschied zwischen Feld # Getannotations() und Feld # getDeclaredAnnotations()
- 22. Datensatz löschen Feld über deepstream Rekord
- 23. Django Admin: Überschreibung löschen Methode
- 24. löschen temporäre Datei während schließlich vs löschen Ausgabedatei beim Fang
- 25. SQL Server xml.modify Methode löschen
- 26. löschen Methode auf Leinwand tkinter
- 27. Solr Datum Feld tdate vs Datum?
- 28. View State vs verstecktes Feld in asp.net
- 29. jQuery size() Methode vs. Längenattribut
- 30. Type.GenericTypeArguments-Eigenschaft vs Type.GetGenericArguments() -Methode