# Angabe von anwedbaren,erreichbare und spezifischen Methoden eines Methodenaufrufs



## BerMo (23. Jan 2021)

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 (23. Jan 2021)

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 (23. Jan 2021)

httpdigest hat gesagt.:


> 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).
> 
> ...


Vielen herzlichen Dank für die ausführliche Erklärung und für die verlinkte Literatur


----------

