Überschreiben mit kontravariante Parameter

CSHW89

Bekanntes Mitglied
Mal ne kleine Frage aus Interesse. Gibt es irgendwelche guten Gründe, warum man beim Überschreiben von Methoden keine kontravarianten Parameter zulässt. Ich meine so etwas:
Java:
class A {
  public void foo(Integer a) {
  }
}
class B extends A {
  @Override
  public void foo(Number a) {
  }
}
Ich hab jetzt nicht unbedingt vor, sowas zu benutzen. In Java wirds das vermutlich auch nie geben, da es sicher zu einigen abwärtskompatiblen Problemen führen würde (siehe Einführung kovariantem Rückgabetyp).
Mich würde es nur interessieren, welche Überlegungen dazu geführt haben, und ob es da große Probleme geben würde, wenn es in einer beliebigen OOP-Sprache vorhanden wäre. Hab da schon ein bisschen gegooglet, aber keine gravierenden Gründe gefunden, die dagegen sprechen. Ein Fall war z.b.:
Java:
class A {
  public void foo(Integer a) {
  }
  public void foo(Double a) {
  }
}
class B extends A {
  @Override
  public void foo(Number a) {
  }
}
Die Frage ist, welche Methode überschreibt nun die Methode aus B. Da sehe ich aber z.b. kein Grund, warum die Methode nicht beide überschreibt.

Würde mich über ein paar Gedanken freuen.

lg Kevin
 

VfL_Freak

Top Contributor
Moin,

ich denke: weder noch ...

http://openbook.rheinwerk-verlag.de...05_010.htm#mj530675a29a46e99d1439817af2844707
Abschnitt 5.10.1
Besitzt eine Unterklasse eine Methode mit dem gleichen Methodennamen und der exakten Parameterliste (also der gleichen Signatur) wie schon die Oberklasse, so überschreibt die Unterklasse die Methode der Oberklasse
und exakt gleich sind Deine Signaturen ja nun nicht ;)

Und zwei verschiedene Methode gleichzeitig mit EINER zu überschreiben, geht nun mal sowie nicht (aus dem gleichen Grund) !!

EDIT: https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
 

mrBrown

Super-Moderator
Mitarbeiter
Moin,

ich denke: weder noch ...

http://openbook.rheinwerk-verlag.de...05_010.htm#mj530675a29a46e99d1439817af2844707

und exakt gleich sind Deine Signaturen ja nun nicht ;)

Und zwei verschiedene Methode gleichzeitig mit EINER zu überschreiben, geht nun mal sowie nicht (aus dem gleichen Grund) !!

EDIT: https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
Das es nicht geht, ist klar, die Frage ist auch, was dagegen spricht, das zu ermöglichen ;)


Ist nicht nötig, da ziemlich leicht anders umzusetzen, bringt aber nur recht viel Komplexität mit.
 

VfL_Freak

Top Contributor
die Frage ist auch, was dagegen spricht, das zu ermöglichen
Weil das doch wohl dem Sinn der Vererbung widersprechen und den Compiler unnütz verwirren würde :cool:

Nur wenn eine Methode formal gleich ist (Name, Signatur, Rückgabewert) ist sie auch überschreibbar!
Deswegen überschreibt auch eine Methode genau EINE Methode - nicht mehr und nicht weniger ...

Gruß Klaus
 

VfL_Freak

Top Contributor
Streng genommen: weder noch :)
Das liegt eher am Compiler und der dahinterliegen Grammatik (ok, somit natürlich auch an der Sprache)!

Du musst Dir mal klar machen, was Überschrieben (im Sinne der OOP) bedeutet!!

Du erweiterst die Methode der Oberklasse um eine neue/andere Funktionalität!
Aber der formale Aufbau (eben Name, Signatur, Rückgabewert) muss halt gleich sein, da es ja anderfalls weine komplette andere Methode wäre ...
https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
 

VfL_Freak

Top Contributor
Und warum sollte es nicht denkbar sein dass eine Methode gleichzeitig zwei der Superklasse überschreibt ?
na, weil dann beide Methode in der Oberklasse im formalen Aufbau (Name, Signatur, Rückgabewert) identisch sein müssten ... und genau das kann der Compiler logischerweise nicht gut verknusen :cool:
Die Eindeutigkeit wäre dann ja verloren gegangen ... :rolleyes:
 

mrBrown

Super-Moderator
Mitarbeiter
Streng genommen: weder noch :)
Das liegt eher am Compiler und der dahinterliegen Grammatik (ok, somit natürlich auch an der Sprache)!

Du musst Dir mal klar machen, was Überschrieben (im Sinne der OOP) bedeutet!!

Du erweiterst die Methode der Oberklasse um eine neue/andere Funktionalität!
Aber der formale Aufbau (eben Name, Signatur, Rückgabewert) muss halt gleich sein, da es ja anderfalls weine komplette andere Methode wäre ...
https://www.teialehrbuch.de/Kostenlose-Kurse/JAVA/6621-Ueberschreiben-von-Methoden.html

Gruß Klaus
Das ist ein im Kreis drehen ;)
Es ist eine komplett andere Methode, weil DIE SPACHE vorgibt, dass es kein Überschreiben ist. Würde die Sprache das ermöglich, wäre es eben keine andere Methode, sondern es würden die ursprünglichen überschrieben werden.

Bei Mehrfachvererbung ist es doch genauso, es ist nicht möglich, weil es so vorgegeben ist, und jede Definition (für Java) wird das auch sinnvoll begründen. Das es trotzdem möglich ist, zeigen andere Sprachen


Es würde aber vermutlich mehr Probleme für Programmierer und Compiler verursachen, als es löst.
 

JStein52

Top Contributor
weil dann beide Methode in der Oberklasse im formalen Aufbau (Name, Signatur, Rückgabewert) identisch sein müssten
Ja weil der Compiler bzw. die Sprache Java so sagen. Aber es ist auch durchaus anders denkbar. Begründe mal warum Name, Signatur und Rückgabewert identisch sein müssen ? Damit der Compiler erkennen kann dass es sich um ein überschreiben handelt oder ?

Edit: ok, ich schliesse mich da meinem Vorredner an
 

CSHW89

Bekanntes Mitglied
Rückgabetyp kann aber seit Java 5 kovariant sein. Nach deine Argumentation @VfL_Freak wäre das auch nicht sinnig. Gründe gegen kontravariante Parameter konnte hier aber noch keiner nennen, außer dass Java es z.z. nicht erlaubt.
 

CSHW89

Bekanntes Mitglied
Ähnliche Java Themen
  Titel Forum Antworten Datum
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
T Überschreiben von Methoden Allgemeine Java-Themen 6
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
T Überschreiben von Methoden erzwingen Allgemeine Java-Themen 20
T Direktes Überschreiben Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
M Überschreiben? Allgemeine Java-Themen 3
A FileChooser Datei-Überschreiben Abfrage Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
M Datensatz auf ein bestimmten Parameter einzugrenzen Allgemeine Java-Themen 11
B JAX - RS.... Multiple parameter application/x-www-form-urlencoded.... Allgemeine Java-Themen 6
B Parameter Konstruktor plus rechnen Allgemeine Java-Themen 6
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
W Haben Konstruktoren in Java eigentlich immer mindestens einen Parameter? Allgemeine Java-Themen 4
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F URI mit Parameter klappt nicht Allgemeine Java-Themen 1
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
temi best practice: Parameter überprüfen, wo? Allgemeine Java-Themen 9
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
MiMa If-Abfrage mit Parameter Allgemeine Java-Themen 8
I Javaaufruf aus Batch inkl. Parameter (Adminrechte) Allgemeine Java-Themen 2
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
K Java FX Zu startenden FXML-Controller per Parameter wählen Allgemeine Java-Themen 2
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
T Klassen Parameter weitergabe Allgemeine Java-Themen 1
M Parameter auslesen im Servlet Allgemeine Java-Themen 0
perlenfischer1984 Wann ist ein Parameter Check sinnvoll Allgemeine Java-Themen 7
Neumi5694 Vererbung Parameter muss 2 Bedingungen erfüllen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
T Parameter Allgemeine Java-Themen 6
R Parameter Adapter - Design Allgemeine Java-Themen 1
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
F In OSX: Java-Programm über URI-Scheme aufrufen mit Parameter? Allgemeine Java-Themen 0
H Generics als Parameter Allgemeine Java-Themen 1
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
OnDemand Maximale Parameter Allgemeine Java-Themen 5
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
S Servlet, per URLConnection Mit String Http Parameter mitsenden Allgemeine Java-Themen 3
M Parameter-Datei einlesen (zeilenweise); Dateiintegrität Allgemeine Java-Themen 7
H JasperReport: Parameter befüllen Allgemeine Java-Themen 7
Joew0815 JList + JTableModel: Parameter der Tabelle übergeben Allgemeine Java-Themen 10
Y Applet/Html - Wie Java-Methode aufrufen, die einen Parameter erwartet? Allgemeine Java-Themen 3
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
F Parameter im Link /jar-Aufruf Allgemeine Java-Themen 12
S OOP Designrichtlinie Parameter Prüfung Allgemeine Java-Themen 7
C char und char-Array als parameter übergeben Allgemeine Java-Themen 6
B Array Parameter Problem Allgemeine Java-Themen 3
C Reflektions, Benutzer soll Konstruktor auswählen und Parameter übergeben können Allgemeine Java-Themen 5
S Keytool: mögliche Werte für Parameter Allgemeine Java-Themen 4
H Externes Programm, Parameter Allgemeine Java-Themen 6
C Webservice: XML Parameter übergabe. Allgemeine Java-Themen 7
M Session-Parameter setzen? Allgemeine Java-Themen 10
P VM-Parameter -D... Allgemeine Java-Themen 3
V Wildcard aus Parameter in return type Allgemeine Java-Themen 2
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
W ScriptEngine + Wie Parameter übergeben bei Fukntion? Allgemeine Java-Themen 2
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
F Parameter für Java Applikation per xml ins Meta-inf speichern? Allgemeine Java-Themen 3
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
R VM-Error - BadWindow (invalid Window parameter) Allgemeine Java-Themen 4
J Parameter an Java übergeben Allgemeine Java-Themen 10
S Neue Instanz eines Objekts erzeugen - Konstruktor erhaelt Parameter. Allgemeine Java-Themen 5
P VM Parameter und .jar Allgemeine Java-Themen 3
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
J Parameter absichtlich für außen verändern Allgemeine Java-Themen 4
A wie kann man Parameter an ein Task übergeben? Allgemeine Java-Themen 3
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G setter und getter: Parameter Überprüfung Allgemeine Java-Themen 6
G JVM Parameter Allgemeine Java-Themen 7
G Parameter Bedeutung Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
J Unicode: cmd parameter (main args); exec params; filenames Allgemeine Java-Themen 2
C US_export_policy.jar und local_policy.jar VM Parameter Allgemeine Java-Themen 1
J Casten ueber generischen Parameter? Allgemeine Java-Themen 5
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
G Parameter oder Attribut (wann nehme ich was?) Allgemeine Java-Themen 12
S .rar-Dateien ein Passwort als Parameter übergeben Allgemeine Java-Themen 5
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
D Parameter parsen? Allgemeine Java-Themen 15
G Typ Parameter & Reflections Allgemeine Java-Themen 4
F mehrere Verzeichnisse als Parameter Allgemeine Java-Themen 15
Y Javadoc - Wie Parameter ansprechen bei Methodenkommentar Allgemeine Java-Themen 2
G Parameter bei mailto Allgemeine Java-Themen 2
C Java Parameter zum starten ohne auf Programmende zu warten Allgemeine Java-Themen 4
V Jar Datei mit Parameter starten Allgemeine Java-Themen 7
P Übergabe- Parameter SQL Map Allgemeine Java-Themen 45
S URL-Parameter auslesen Allgemeine Java-Themen 2
F Parameter vs Argument Allgemeine Java-Themen 4
T xverify-parameter : Workaround zur Laufzeit? Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben