Heim  >  Artikel  >  Java  >  Warum kann das Schlüsselwort „super“ nicht zum Binden von Typparametern in Java-Generika verwendet werden?

Warum kann das Schlüsselwort „super“ nicht zum Binden von Typparametern in Java-Generika verwendet werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 09:21:02844Durchsuche

Why can't the 'super' keyword be used to bound type parameters in Java generics?

Generika mit dem Schlüsselwort „super“ begrenzen: Eine ausführliche Erklärung

Frage: Warum kann das Schlüsselwort „super“ nicht verwendet werden? gebundene Typparameter, im Gegensatz dazu Platzhalter?

Antwort:

Das Begrenzen eines Typparameters mit „super“ (z. B. „“) ist in Java nicht zulässig, da dies effektiv der Fall wäre haben einen vernachlässigbaren Einfluss auf die Art der Bindung und würden ihren beabsichtigten Zweck nicht erfüllen.

Betrachten Sie Folgendes als hypothetisch Code:

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}

Dieser Code schlägt vor, dass die „toArray“-Methode in der „Collection“-Schnittstelle einen Typparameter „S“ haben sollte, der ein Supertyp von „T“ ist. Diese Grenze wäre jedoch bedeutungslos, da jeder Typ ein Supertyp von „Object“ ist und da ein Array eines beliebigen Referenztyps in ein „Object[]“ umgewandelt werden kann, würde der Compiler die Übergabe jedes Arrays als Argument an zulassen „toArray“, unabhängig davon, ob es sich um einen beabsichtigten Untertyp handelt.

Daher würde die Verwendung von „super“ zum Binden von Typparametern Laufzeitfehler wie „ArrayStoreException“ nicht verhindern. Daher ist es im Typsystem von Java nicht zulässig.

Beispiel:

Betrachten Sie eine hypothetische generische Methode:

<T super Integer> void add(T number)

Diese Methode beabsichtigt um das Hinzufügen von „Ganzzahlen“, „Zahlen“ und „Objekten“ zu ermöglichen (da sie alle Oberklassen von „Ganzzahl“ sind), aber 'Strings' nicht zulassen, da dies nicht der Fall ist. Da „Object“ jedoch eine Superklasse von „Integer“ ist, können aufgrund der impliziten Umwandlung immer noch „Strings“ hinzugefügt werden, was zu potenziellen Laufzeitfehlern führen kann.

Zusätzliche Überlegungen:

  • Generika und Arrays:Generika und Arrays unterliegen inhärenten Einschränkungen und können nicht miteinander vermischt werden nahtlos.
  • Alternativen zur Verwendung von „super“: Um in solchen Szenarien Typsicherheit zu erreichen, wird empfohlen, Platzhalter oder Methodenüberladung anstelle der Begrenzung von Typparametern mit „super“ zu verwenden.

Verwandt Ressourcen:

  • Java-Tutorials/Generika

    • Subtypisierung
    • Mehr Spaß mit Platzhaltern
  • Java Generics: Was ist PECS? (Producer erweitert Consumer Super)
  • Was ist der Unterschied zwischen Super und Extens in Java Generics

Das obige ist der detaillierte Inhalt vonWarum kann das Schlüsselwort „super“ nicht zum Binden von Typparametern in Java-Generika verwendet werden?. 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