Überschreiben von Methoden mit kovarianten Rückgabetypen in Java
Entgegen der landläufigen Meinung ist es tatsächlich möglich, dass überschriebene Methoden hinsichtlich ihrer Rückgabe abweichen Typen in Java. Genauer gesagt erlaubt Java kovariante Rückgabetypen, sodass eine überschreibende Methode einen Rückgabetyp besitzen kann, der verfeinert ist als der der überschriebenen Methode. Dies bedeutet, dass der Rückgabetyp der überschreibenden Methode dem Rückgabetyp der überschriebenen Methode zuweisbar sein muss.
Ein anschauliches Beispiel wäre das folgende Codefragment:
class ShapeBuilder { ... public Shape build() { .... } } class CircleBuilder extends ShapeBuilder{ ... @Override public Circle build() { .... } }
In diesem Fall , überschreibt die build()-Methode der CircleBuilder-Klasse die von ShapeBuilder geerbte build()-Methode. Entscheidend ist, dass die build()-Methode in CircleBuilder ein Circle-Objekt zurückgibt, das im Vergleich zum von ShapeBuilder zurückgegebenen Shape-Objekt einen spezifischeren Typ hat.
Dieses Verhalten ist in Abschnitt 8.4.5 der Java-Sprachspezifikation kodifiziert. Darin heißt es ausdrücklich: „Rückgabetypen können zwischen Methoden variieren, die sich gegenseitig überschreiben, wenn es sich bei den Rückgabetypen um Referenztypen handelt.“ Dieses Prinzip liegt dem Konzept kovarianter Rückgaben zugrunde, wobei der Rückgabetyp einer überschreibenden Methode auf einen Untertyp spezialisiert werden kann.
Darüber hinaus werden in der Spezifikation spezifische Bedingungen beschrieben, die für die Ersetzbarkeit des Rückgabetyps zwischen zwei Methoden erfüllt sein müssen :
Referenzrückgabetypen müssen entweder:
Vor Java 5 hielt Java an der invarianten Rückgabe fest Typen. Im Gegensatz dazu bieten kovariante Rückgabetypen eine größere Flexibilität beim Überschreiben von Methoden, sodass die Rückgabetypen besser an der spezifischen Implementierung der überschriebenen Methode ausgerichtet werden können.
Das obige ist der detaillierte Inhalt vonKönnen überschreibende Methoden in Java unterschiedliche Rückgabetypen haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!