Angabe von anwedbaren,erreichbare und spezifischen Methoden eines Methodenaufrufs

BerMo

Neues Mitglied
Gegeben sind die folgenden Klassendefinitionen.

public class Foo extends Object {
private Object f(Object x, Foo y) {...}
public String g(String x, Bar y) {...}
protected Object f(Object x, Bar y) {...}
public Object f(String x, Object y) {...}
}

public class Bar extends Foo {
public Integer f(String x, Foo y) {...}
public Object f(Bar x, Foo y) {...}
public String f(Object x, Bar y) {...}
}

Außerdem gelten die zusätzlichen Subtypbeziehungen Integer ⊑ Object und String ⊑ Object aus den Java-Bibliotheken.

Ich soll den Bindungsprozess von Java nachvollziehen , indem ich die drei Mengen der erreichbaren, anwendbaren und spezifischsten Methoden für den folgenden Methodenaufruf angebe:

new Bar().f(new String("foo"), new Bar());

Bis jetzt habe ich die folgenden Methoden angegeben

Vor allem bei den spezifischen Methoden bin ich mirjedoch nicht sicher ,ob das so korrekt ist .

1. Erreichbare Methoden:
{g[String, Bar], f[String, Object], f[String, foo], f[Bar, Foo], f[Object, Bar]}


2. Anwendbare Methoden:
{f[String, Object], f[String, Foo], f[Object, Bar]}


3. Spezifische Methoden:
{f[String, Foo], f[Object, Bar]} ????
 

httpdigest

Top Contributor
Deine Liste der anwendbaren und spezifischen Methoden ist meiner Meinung nach korrekt. Nur die Liste der erreichbaren Methoden vermutlich (zumindest gemäss JLS §15.12.4.3) nicht. Um herauszufinden, gegen welche Methodensignatur konkret gelinked werden soll, wird zumindest von einem gegebenen Namen der aufgerufenen Methode ausgegangen. Wir wissen ja schon, dass wir einen Methodenaufruf einer Methode mit dem Namen `f` linken wollen, also sind auch nur solche Methoden mit Namen `f` erreichbar. Man _kann_ argumentieren, dass ja eben auch `g` erreichbar ist, spielt aber im Kontext des betrachteten Methodenaufrufes keine Rolle, ist also irrelevant. Ich würde also `g` aus der Liste der erreichbaren Methoden streichen.

Da die Liste der spezifischsten Methoden (nach JLS §15.12.2.5) nunmal nicht eindeutig ist (bzw. mehr als eine mögliche Methodensignatur beinhaltet), ist der Methodenaufruf auch nicht gültig (da mehrdeutig).

Referenzen zum Nachlesen:

Erreichbarkeit: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.4.3

Anwendbare Methoden: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.2, https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.3, https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.4

Spezifischste Methode: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5
 

BerMo

Neues Mitglied
Deine Liste der anwendbaren und spezifischen Methoden ist meiner Meinung nach korrekt. Nur die Liste der erreichbaren Methoden vermutlich (zumindest gemäss JLS §15.12.4.3) nicht. Um herauszufinden, gegen welche Methodensignatur konkret gelinked werden soll, wird zumindest von einem gegebenen Namen der aufgerufenen Methode ausgegangen. Wir wissen ja schon, dass wir einen Methodenaufruf einer Methode mit dem Namen `f` linken wollen, also sind auch nur solche Methoden mit Namen `f` erreichbar. Man _kann_ argumentieren, dass ja eben auch `g` erreichbar ist, spielt aber im Kontext des betrachteten Methodenaufrufes keine Rolle, ist also irrelevant. Ich würde also `g` aus der Liste der erreichbaren Methoden streichen.

Da die Liste der spezifischsten Methoden (nach JLS §15.12.2.5) nunmal nicht eindeutig ist (bzw. mehr als eine mögliche Methodensignatur beinhaltet), ist der Methodenaufruf auch nicht gültig (da mehrdeutig).

Referenzen zum Nachlesen:

Erreichbarkeit: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.4.3

Anwendbare Methoden: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.2, https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.3, https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.4

Spezifischste Methode: https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5
Vielen herzlichen Dank für die ausführliche Erklärung und für die verlinkte Literatur
 

Neue Themen


Oben