Begrenzen von Generika mit dem Schlüsselwort „super“: Eine umfassende Erklärung
Java-Generika ermöglichen Typsicherheit und Wiederverwendbarkeit von Code. Ein Aspekt von Generika ist die Typbegrenzung, bei der ein Typparameter auf eine bestimmte Subtypbeziehung beschränkt werden kann. Im Gegensatz zu Platzhaltern können Typparameter jedoch nicht mit dem Schlüsselwort „super“ begrenzt werden.
In der Collection-Schnittstelle akzeptiert die toArray-Methode ein Argument vom Typ „S[]“, wobei „S“ ein Typparameter ist. Es stellt sich die Frage, warum die Methode nicht als „“ deklariert ist. anstelle eines Platzhalters „“.
Die Antwort liegt im Verhalten der „Super“-Begrenzung. Während „super“ normalerweise mit Platzhaltern (<'? super T'>) verwendet wird, hat die Anwendung auf Typparameter (<'' anstelle von '>) Auswirkungen eine unbeabsichtigte Konsequenz. Object ist die Oberklasse aller Referenztypen, was bedeutet, dass „Object[]“ ein gültiges Argument für „<'S super T>>“ ist. zur Kompilierungszeit. Dies macht den Zweck der Bindung zunichte, da jedes Referenztypargument übergeben werden könnte, auch solche, die keine Unterklassen von „T“ sind.
Daher würde die „Super“-Begrenzung von Typparametern nicht den erwarteten Schutz bieten ungültige Argumente. Zur Veranschaulichung: Die hypothetische Methode „<> S[] toArray(S[] a)' mit '
Diese Einschränkung ergibt sich aus dem Zusammenspiel zwischen Generika und Arrays. Für Generics und Arrays gelten unterschiedliche Kovarianzregeln, die zum beobachteten Verhalten führen.
Es ist wichtig zu beachten, dass diese Einschränkung nur für Typparameter gilt. Platzhalter können weiterhin mit „super“ gebunden werden, um Varianz auszudrücken, wie in „<“ zu sehen ist. super T>' in der toArray-Methode, was eine größere Flexibilität ermöglicht.
Weitere Einblicke zu Generika und Typbegrenzung finden Sie in den folgenden Ressourcen:
Das obige ist der detaillierte Inhalt vonWarum können wir das Schlüsselwort „super' nicht für Typparametergrenzen in Java Generics verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!