Heim > Web-Frontend > js-Tutorial > Mehrdeutigkeitsfehler bei Generika

Mehrdeutigkeitsfehler bei Generika

Barbara Streisand
Freigeben: 2024-12-31 06:20:10
Original
687 Leute haben es durchsucht

Erros de Ambiguidade com Genéricos

1. Was sind Mehrdeutigkeitsfehler?

  • Entstehen, wenn das Löschen zwei scheinbar unterschiedliche generische Deklarationen in identische Typen umwandelt, was zu Kompilierungskonflikten führt.
  • Sie treten besonders häufig in Szenarien mit Methodenüberladung auf.

2. Beispiel für Mehrdeutigkeit: Erasure Overload

Problematischer Code:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    // Tentativa de sobrecarga
    void set(T o) {
        ob1 = o;
    }

    void set(V o) {
        ob2 = o;
    }
}

Nach dem Login kopieren

Fehler: Der Versuch, die set()-Methode basierend auf den generischen Parametern T und V zu überladen, erscheint gültig, führt jedoch zu Mehrdeutigkeiten.

3. Gründe für Unklarheiten

  • Erstes Problem: T und V können vom gleichen Typ sein.

Beispiel:

MyGenClass<String, String> obj = new MyGenClass<>();

Nach dem Login kopieren

Hier werden sowohl T als auch V durch String ersetzt, wodurch die beiden Versionen von set() identisch sind.

Ergebnis:

  • Der Compiler kann nicht zwischen den beiden Methoden unterscheiden.

Zweites Problem: Durch Löschen werden Typen auf Objekte reduziert.

  • Während der Kompilierung werden beide Methoden umgewandelt in:
void set(Object o) {
    // ...
}

Nach dem Login kopieren

Dadurch entfällt jegliche Unterscheidung zwischen T und V, wodurch eine Überladung unmöglich wird.

4. Warum passiert das?

  • Löschen entfernt generische Typinformationen und ersetzt sie durch ihre Grenztypen (oder Objekt, wenn keine Grenze angegeben ist).
  • Im Fall von set(T) und set(V) werden beide im vom Compiler generierten Code letztendlich als set(Object) behandelt.

5. Lösung: Vermeiden Sie generische Überlastung
Um die Mehrdeutigkeit zu beseitigen, verwenden Sie unterschiedliche Namen für die Methoden.

Korrigiertes Beispiel:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    void setOb1(T o) {
        ob1 = o;
    }

    void setOb2(V o) {
        ob2 = o;
    }
}

Nach dem Login kopieren

Hier sind setOb1() und setOb2() unterschiedliche Methoden, wodurch der Konflikt beseitigt wird.

6. Fazit
Mehrdeutigkeiten wie diese treten auf, weil beim Löschen generische Parameter in einfache Typen (Objekt) umgewandelt werden.
Um Fehler zu vermeiden, befolgen Sie diese Vorgehensweisen:

  • Vermeiden Sie das Überladen von Methoden mit generischen Parametern.
  • Geben Sie Methoden, die verschiedene generische Typen manipulieren, unterschiedliche Namen. Das Verständnis des Löschverhaltens hilft, diese Probleme zu vermeiden und generische Klassen sicher zu entwerfen.

Das obige ist der detaillierte Inhalt vonMehrdeutigkeitsfehler bei Generika. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage