Diese Regel soll Konflikte in Legacy-Code vermeiden, der weiterhin Rohtypen verwendet.
Hier ist ein Beispiel dafür, warum dies nicht erlaubt war , aus dem JLS. Angenommen, bevor Generika in Java eingeführt wurden, habe ich folgenden Code geschrieben:
class CollectionConverter {
List toList(Collection c) {...}
}
Sie erweitern meine Klasse wie folgt:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
Nach der Einführung von Generika habe ich beschlossen, meine Bibliothek zu aktualisieren.
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
Sie sind nicht bereit, Aktualisierungen vorzunehmen, und lassen Ihre Overrider
Klasse in Ruhe. Um das richtig zu überschreibentoList()
Methode , entschieden die Sprachdesigner, dass ein Rohtyp einem generierten Typ "überschreibungsäquivalent" ist. Dies bedeutet, dass Ihre Methodensignatur formal nicht mehr der Signatur meiner Oberklasse entspricht, Ihre Methode jedoch weiterhin überschreibt.
Jetzt vergeht die Zeit und Sie entscheiden, dass Sie bereit sind, Ihre Klasse zu aktualisieren. Aber Sie vermasseln ein wenig und anstatt die vorhandene Rohmethode zu bearbeiten toList()
, fügen Sie eine neue Methode wie die folgende hinzu:
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
Aufgrund der Überschreibungsäquivalenz von Rohtypen liegen beide Methoden in einer gültigen Form vor, um die toList(Collection<T>)
Methode zu überschreiben . Aber natürlich muss der Compiler eine einzelne Methode auflösen. Um diese Mehrdeutigkeit zu beseitigen, dürfen Klassen nicht mehrere Methoden haben, die überschreibungsäquivalent sind, dh mehrere Methoden mit denselben Parametertypen nach dem Löschen.
Der Schlüssel ist, dass dies eine Sprachregel ist, die entwickelt wurde, um die Kompatibilität mit altem Code unter Verwendung von Rohtypen aufrechtzuerhalten. Es ist keine Einschränkung, die durch das Löschen von Typparametern erforderlich ist. Da die Methodenauflösung zur Kompilierungszeit erfolgt, wäre das Hinzufügen generischer Typen zur Methodenkennung ausreichend gewesen.