Heim >Java >javaLernprogramm >Warum verhindert Java die Duplizierung von Methodensignaturen nach dem generischen Löschen?

Warum verhindert Java die Duplizierung von Methodensignaturen nach dem generischen Löschen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-25 16:56:13898Durchsuche

Why Does Java Prevent Method Signature Duplication After Generic Erasure?

Methodensignaturduplizierung und generische Löschung

In Java ist es nicht zulässig, zwei Methoden innerhalb derselben Klasse zu deklarieren, die dieselbe Löschung haben nachdem die Typlöschung auf ihre generischen Typen angewendet wurde. Diese Einschränkung ergibt sich aus der Möglichkeit von Konflikten mit Legacy-Code, der Rohtypen verwendet.

Betrachten Sie das folgende Beispiel:

class Test {
   void add(Set<Integer> ii) {}
   void add(Set<String> ss) {}
}

Dieser Code würde den Kompilierungsfehler auslösen: „Method add(Set)“ hat die gleiche Löschung add(Set) wie eine andere Methode im Typ Test.“

Um den Grund dieser Einschränkung zu verstehen, verfolgen wir die Entwicklung einer Hypothese Codebasis:

Zunächst, bevor Generika in Java eingeführt wurden, könnte der folgende Code geschrieben worden sein:

class CollectionConverter {
  List toList(Collection c) {...}
}

Anschließend wurde eine Erweiterung dieser Klasse erstellt:

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}

Mit der Einführung von Generika wurde die CollectionConverter-Klasse aktualisiert:

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}

Die Die Overrider-Klasse wurde unverändert gelassen. Um die toList()-Methode weiterhin korrekt zu überschreiben, wurde entschieden, dass Rohtypen „überschreibungsäquivalent“ zu generierten Typen sind.

Später versuchte der Entwickler von Overrider, die Klasse zu aktualisieren, fügte jedoch neben der Klasse eine neue Methode hinzu vorhandene rohe toList()-Methode:

class Overrider extends CollectionConverter {
  @Override
  List toList(Collection c) {...}
  @Override
  <T> List<T> toList(Collection<T> c) {...}
}

Aufgrund der Überschreibungsäquivalenz von Rohtypen könnten beide Methoden möglicherweise die überschreiben toList(Collection)-Methode. Diese Mehrdeutigkeit musste jedoch für den Compiler gelöst werden.

Um solche Konflikte zu verhindern, beschränkt die Java-Sprache die Existenz mehrerer Methoden mit derselben Löschung innerhalb einer einzelnen Klasse. Dadurch wird sichergestellt, dass Entwickler Methoden sicher überschreiben können, ohne dass Mehrdeutigkeiten entstehen, die durch Legacy-Code verursacht werden, der Rohtypen verwendet.

Das obige ist der detaillierte Inhalt vonWarum verhindert Java die Duplizierung von Methodensignaturen nach dem generischen Löschen?. 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