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
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!