


Warum führen mehrere Platzhalter bei generischen Methoden in Java zu Verwirrung?
Mehrere Platzhalter für generische Methoden: Ein Java-Compiler-Rätsel
Einführung
In Java-Generika , Platzhalter (*) stehen für unbekannte Typen. Wenn bei generischen Methoden mehrere Platzhalter verwendet werden, kann dies zu Verwirrung und unerwartetem Verhalten führen. Dieser Artikel untersucht die Komplexität mehrerer Platzhalter und ihre Auswirkungen auf die Typsicherheit von Java.
Die Verwirrung
Bedenken Sie den folgenden Code:
public class TwoListsOfUnknowns { static void doNothing(List> list1, List> list2) { } public static void main(String[] args) { List<string> list1 = null; List<integer> list2 = null; doNothing(list1, list2); // compiles fine! } }</integer></string>
Die beiden Platzhalter in doNothing scheinen nichts miteinander zu tun zu haben, sodass Sie es mit einem List
static void doSomethingIllegal(List> list1, List> list2) { list1.addAll(list2); // DOES NOT COMPILE!!! }
Dies deutet darauf hin, dass list1 und list2 zwar unterschiedliche Typen sein können, aber möglicherweise eine Verbindung haben, die eine direkte Verwendung verhindert.
Die Verwirrung durch verschachtelte Platzhalter
Weitere Untersuchungen zeigen, dass die Verwirrung nicht in mehreren Platzhaltern, sondern in verschachtelten Platzhaltern liegt Platzhalter:
public class LOLUnknowns1 { static void probablyIllegal(List<list>> lol, List> list) { lol.add(list); // this compiles!! how come??? } }</list>
Dieser Code lässt sich fehlerfrei kompilieren, auch wenn die Liste einen anderen Typ als die Elemente von lol haben könnte. Es ist jedoch wichtig zu beachten, dass dieses Szenario Fragen zur Typsicherheit aufwirft.
Die Wahrheit: Capture-Konvertierung
Die Verwirrung entsteht durch ein Konzept namens Capture-Konvertierung. Es ermöglicht bestimmten Platzhaltern, bestimmte Typen zu erfassen, wenn sie in generischen Methoden verwendet werden. Aus diesem Grund wird die folgende Variante von „wahrscheinlich illegal“ kompiliert:
static void probablyIllegalAgain(List<list extends number>> lol, List extends Number> list) { lol.add(list); // compiles fine!!! how come??? }</list>
Hier kann der Platzhalter in lol einen Typ erfassen, der Number erweitert, wie z. B. List
Verschachtelte Platzhalter verstehen
Die wichtigste Erkenntnis ist, dass mehrere Platzhalter selbst kein Problem darstellen. Die Verwirrung entsteht, wenn versucht wird, einen verschachtelten Platzhalter zu verwenden, um einen Typ zu erfassen, der aufgrund von Typabweichungen nicht „kompatibel“ ist.
Im Fall von LOLUnknowns1 ist der verschachtelte Platzhalter in List> kann einen bestimmten Typ nicht erfassen, da die Erfassung nicht für alle möglichen Elementtypen von lol sicher wäre. Aus diesem Grund kann eine Liste von beliebigem Typ sein, was zu potenziellen Problemen mit der Typsicherheit führen kann.
Fazit
Mehrere Platzhalter bei generischen Methoden können verwirrend sein, aber das Verständnis der Capture-Konvertierung und seine Grenzen sind entscheidend. Verschachtelte Platzhalter müssen sorgfältig geprüft werden, um die Typsicherheit zu gewährleisten. Durch die Einhaltung dieser Prinzipien können Sie sich in den Feinheiten der Java-Generika zurechtfinden und robusten Code schreiben.
Das obige ist der detaillierte Inhalt vonWarum führen mehrere Platzhalter bei generischen Methoden in Java zu Verwirrung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

VSCode Windows 64-Bit-Download
Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung