Heim  >  Artikel  >  Java  >  Warum können wir das Schlüsselwort „super“ nicht für Typparametergrenzen in Java Generics verwenden?

Warum können wir das Schlüsselwort „super“ nicht für Typparametergrenzen in Java Generics verwenden?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 16:22:30182Durchsuche

Why Can't We Use 'super' Keyword for Type Parameter Bounds in Java Generics?

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 '' da „Integer“ immer noch ein Argument vom Typ „String[]“ zulassen würde, obwohl „String“ keine Oberklasse von „Integer“ ist. Da „String[]“ ein „Objekt[]“ ist, würde es die „Super“-Grenze erfüllen.

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:

  • Java-Tutorials/Generika
  • Java Generics: Was ist PECS?
  • Was ist der Unterschied zwischen Super und Extens in Java Generics

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn