Question

Je le code suivant:

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

Ce code produit les éléments suivants:

SuperClass: super
SubClass: sub
T: super

Ma question est: Pourquoi ne pas T.getName () retourne la valeur de SubClass.getName ()? Après tout, je précisé que T == SubClass. Ou sont fonction statique appels non valide pour les références génériques?

Merci beaucoup à l'avance!

Était-ce utile?

La solution

Ce n'est pas seulement une question au sujet des médicaments génériques.

Si vous dites:

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

vous obtiendrez également "super". Il n'y a pas de méthodes statiques « polymorphes ».

Dans votre cas, tout le compilateur sait qu'il est T SuperClass prolonge, il appellera SuperClass.getName().

Autres conseils

Contrairement à C ++, Java modèles génériques travail par l'effacement de type, de sorte qu'il ne génère qu'une seule classe pour toutes les valeurs de T, et se traduit par toutes les références à taper dans cette classe SuperClass au super type de Dummy<SubClass>.print(), en ce cas SubClass, utilise ensuite l'expédition virtuelle pour fournir la variance pour les appels aux méthodes objet, et l'expédition statique aux appels aux méthodes statiques.

Alors, quand vous faites Dummy, le compilateur ne fait pas de remplacement global de <=> avec en <=> <=>. Tout le compilateur fait est de vérifier qui utilise des comme argument <=> ou le type de retour dans les méthodes de sont <=> <=>. Il n'y a aucun changement à tout code à l'intérieur <=>, donc la même méthode statique <=> est appelée tout est <=>.

Si vous voulez un comportement différent dans une classe générique selon le type paramétrés, vous avez passer un objet de ce type et utiliser une méthode virtuelle, ou passer dans la classe pour la réflexion du type et de l'utilisation.

Lorsque vous instancié la classe avec « nouvelle Dummy () » vous avez appelé le constructeur par défaut qui ne fait rien pas défini. Lorsque la méthode d'impression se est appelée, la machine virtuelle a vu que le type de T, tel que déclaré dans la déclaration de classe, est SuperClass; Elle appelle ensuite la méthode statique sur cette classe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top