Domanda

Ho il seguente codice:

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();
    }
}

Questo codice genera il seguente:

SuperClass: super
SubClass: sub
T: super

La mia domanda è: Perché non T.getName () restituiscono il valore di SubClass.getName ()? Dopo tutto, ho specificato che T == sottoclasse. O sono funzione statica chiamate non valide per i riferimenti generici?

Grazie mille in anticipo!

È stato utile?

Soluzione

Questa non è solo una questione su farmaci generici.

Se si dice:

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

si riceverà anche "super". Non ci sono metodi statici "polimorfica".

Nel tuo caso, tutto il compilatore sa di T è che si estende SuperClass, quindi chiamerà SuperClass.getName().

Altri suggerimenti

A differenza dei modelli C ++, Java generici opera di cancellazione del tipo, così si genera una sola classe per tutti i valori di T, e traduce tutti i riferimenti a digitare SuperClass in questa classe per il tipo eccellente di Dummy<SubClass>.print(), in questo caso SubClass, quindi utilizza invio virtuale per fornire la varianza per le chiamate ad oggetto metodi e spedizione statica per chiamate ai metodi statici.

Quindi, quando si fa Dummy, il compilatore non fa una sostituzione globale di <=> con <=> in <=>. Tutto il compilatore non è controllo che utilizza di <=> come argomento o il tipo di ritorno nei metodi di <=> sono <=>. Non c'è alcun cambiamento a qualsiasi codice all'interno <=>, così lo stesso metodo statico <=> viene chiamato qualunque <=> è.

Se si vuole un comportamento diverso in una classe generica a seconda del tipo parametrizzato, si dispone di passare un oggetto di quel tipo e utilizzare un metodo virtuale, o passare nella classe per il tipo e l'uso di riflessione.

Quando si istanziare la classe con "nuova Dummy ()" che hai chiamato il costruttore di default, che in realtà non impostare nulla. Quando il metodo di stampa stato chiamato, la VM ha visto che il tipo di T, come dichiarato nella dichiarazione della classe, è SuperClass; E poi chiama il metodo statico su questa classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top