Frage

Ich habe den folgenden Code:

class SuperClass {
    public static String getName() { return "super"; }
}

class SubClass extends SuperClass {
    public static String getName() { return "sub"; }
}

public class Dummy<T extends SuperClass> {
    public void print() {
        System.out.println("SuperClass: " + SuperClass.getName());
        System.out.println("SubClass: " + SubClass.getName());
        System.out.println("T: " + T.getName());
    }
    public static void main(String[] args) {
        new Dummy<SubClass>().print();
    }
}

Dieser Code gibt folgende Möglichkeiten:

SuperClass: super
SubClass: sub
T: super

Meine Frage ist: Warum nicht T.getName () gibt den Wert von SubClass.getName ()? Immerhin angegeben ich das T == SubClass. Oder sind statische Funktion für allgemeine Verweise ungültig nennt?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Dies ist nicht nur eine Frage über Generika.

Wenn Sie sagen:

SuperClass obj = new SubClass();
System.out.println(obj.getName());

Sie werden auch "super" erhalten. Es gibt keine „polymorphe“ statische Methoden.

In Ihrem Fall alle der Compiler kennt T ist, dass es SuperClass erstreckt, so wird es SuperClass.getName() nennen.

Andere Tipps

Im Gegensatz zu C ++ Vorlagen, Java Generics Arbeit von Typ Löschung, so dass es nur für alle Werte von T eine Klasse erzeugt und übersetzt alle Verweise T in dieser Klasse zum Supertyp T, in diesem Fall SuperClass zu geben, dann Verwendungen virtuelle Dispatch die Varianz liefern für Anrufe Methoden-Objekt, und statische Dispatch auf Anrufe zu den statischen Methoden.

Wenn Sie also Dummy<SubClass>.print() tun, wird der Compiler keine globale mit T in SubClass von Dummy ersetzen machen. Alle der Compiler tut, ist die Überprüfung von T verwendet als Argument oder Rückgabetyp in den Methoden der Dummy sind SubClass. Es gibt keine Änderung an jeden Code in Dummy, so dass die gleichen SuperClass statischen Methode wird aufgerufen, was T ist.

Wenn Sie ein anderes Verhalten in einer generischen Klasse wollen auf den parametrierten je nach Typ, haben Sie ein Objekt dieser Art in geben und eine virtuelle Methode verwenden, oder in der Klasse übergeben für die Art und Verwendung Reflexion.

Wenn Sie die Klasse mit „neuer Dummy ()“ instanziiert Sie den Standard-Konstruktor aufgerufen, die eigentlich nichts festgelegt. Als Druckverfahren genannt wurde, sah der VM, dass die Art von T, wie in der Klassendeklaration deklariert, ist Oberklasse; Es ruft dann die statische Methode auf dieser Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top