berladung der Java-Methode - Generische Parameter und Parameter innerhalb desselben Vererbungsbau

Nehmen wir an, ich habe folgenden Code:

// Method acception generic parameter
public static <T> T foo(T para) {
    return para;
}

// Method accepting Integer parameter
public static Integer foo(Integer para) {
    return para + 1;
}

// Method accepting Number parameter
public static Number foo(Number para) {
    return para.intValue() + 2;
}

public static void main(String[] args) {
    Float f = new Float(1.0f);
    Integer i = new Integer(1);
    Number n = new Integer(1);
    String s = "Test";

    Number fooedFloat = foo(f);     // Uses foo(Number para)
    Number fooedInteger = foo(i);   // Uses foo(Integer para)
    Number fooedNumber = foo(n);    // Uses foo(Number para)
    String fooedString = foo(s);    // Uses foo(T para)

    System.out.println("foo(f): " + fooedFloat);
    System.out.println("foo(i): " + fooedInteger);
    System.out.println("foo(n): " + fooedNumber);
    System.out.println("foo(s): " + fooedString);
}

Die Ausgabe sieht folgendermaßen aus:

foo(f): 3
foo(i): 2
foo(n): 3
foo(s): Test

Jetzt die Frage (n):

foo(n) Anrufefoo(Number para), wahrscheinlich weiln ist definiert alsNumber, obwohl es ein @ hInteger zugewiesen. Stimmt die Annahme, dass die Entscheidung, welche der überladenen Methoden angewendet wird, zur Kompilierungszeit ohne dynamische Bindung erfolgt? (Frage überstatisc und dynamic Bindung)foo(f) Verwendetfoo(Number para), währendfoo(i) Verwendetfoo(Integer para). Nurfoo(s) verwendet die generische Version. Der Compiler prüft also immer, ob es für die angegebenen Typen eine nicht generische Implementierung gibt, und nur, wenn er nicht auf die generische Version zurückgreift. (Frage über generics)Nochmal,foo(f) Verwendetfoo(Number para), währendfoo(i) Verwendetfoo(Integer para). Noch,Integer i wäre auch einNumber. Wird also immer die Methode mit dem "äußersten" Typ innerhalb des Vererbungsbaums genommen? (Frage überErb)

Ich weiß, das sind viele Fragen, und das Beispiel stammt nicht aus produktivem Code, aber ich möchte nur wissen, was "dahinter" und warum Dinge passieren.

Auch Links zur Java-Dokumentation oder zur Java-Spezifikation sind sehr willkommen, ich konnte sie selbst nicht finden.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage