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
Freigeben: 2024-12-25 16:56:13
Original
892 Leute haben es durchsucht

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) {}
}
Nach dem Login kopieren

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) {...}
}
Nach dem Login kopieren

Anschließend wurde eine Erweiterung dieser Klasse erstellt:

class Overrider extends CollectionConverter {
  List toList(Collection c) {...}
}
Nach dem Login kopieren

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

class CollectionConverter {
  <T> List<T> toList(Collection<T> c) {...}
}
Nach dem Login kopieren

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) {...}
}
Nach dem Login kopieren

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!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage