Diese Regel soll Konflikte in altem Code vermeiden, der noch rohe Typen verwendet.
Hier ist eine Illustration, warum dies nicht erlaubt war, aus der JLS. Angenommen, ich habe vor der Einführung der Generics in Java einen Code wie diesen geschrieben:
class CollectionConverter {
List toList(Collection c) {...}
}
Sie erweitern meine Klasse, etwa so:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
Nach der Einführung der Generika habe ich beschlossen, meine Bibliothek zu aktualisieren.
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
Sie sind nicht bereit, Aktualisierungen vorzunehmen, also lassen Sie Ihre Overrider
Klasse allein. Um die Klasse korrekt zu überschreiben toList()
Methode haben die Sprachdesigner beschlossen, dass ein Rohtyp mit jedem generierten Typ "überschreibungsäquivalent" ist. Das bedeutet, dass Ihre Methodensignatur zwar formal nicht mehr mit der Signatur meiner Oberklasse übereinstimmt, Ihre Methode aber immer noch überschrieben wird.
Nun vergeht die Zeit und Sie beschließen, dass Sie Ihre Klasse aktualisieren möchten. Aber Sie vermasseln es ein wenig, und anstatt die bestehende, unbearbeitete toList()
Methode, Sie hinzufügen. eine neue Methode wie diese:
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
Aufgrund der Überschreibungsäquivalenz von Rohtypen sind beide Methoden in einer gültigen Form, um die toList(Collection<T>)
Methode. Aber natürlich muss der Compiler eine einzelne Methode auflösen. Um diese Zweideutigkeit zu beseitigen, dürfen Klassen nicht mehrere Methoden haben, die gleichwertig sind, d. h. mehrere Methoden mit denselben Parametertypen nach dem Löschen.
Der Schlüssel ist, dass dies eine Sprachregel ist, die die Kompatibilität mit altem Code, der rohe Typen verwendet, aufrechterhalten soll. Es handelt sich nicht um eine Einschränkung, die durch die Löschung von Typparametern erforderlich ist; da die Methodenauflösung zur Kompilierzeit erfolgt, hätte das Hinzufügen generischer Typen zum Methodenbezeichner ausgereicht.