3
votes

Classe générique comme variable dans le constructeur

J'ai la classe A

 class C {
    public static void main(String args[]) {
        B b=new B(new A());// A cannot be converted to Class<? extends A>.
        B b=new B(new A1());// A1 cannot be converted to Class<? extends A>.
            }
}

la classe A1 étend la classe A

class B{
    Class<? extends A> variable;

    public B(Class<? extends A> variable) {
        this.variable = variable;
    }
}

maintenant dans la classe B, je veux passer toute classe qui étend la classe A en tant que variable.

class A1 extends A{}

pour exécuter ci-dessus, la classe du pilote est comme ci-dessous

class A{}

car Classe étend A> variable cela signifie, toute classe étendant la classe A peut être passée dans le constructeur et A1 étend A, alors pourquoi est-ce qu'il donne une erreur?

qu'est-ce que je manque?


1 commentaires

Vous transmettez des instances au lieu des classes. Passez les classes ou modifiez la signature pour accepter les instances à la place.


3 Réponses :


1
votes

Ce qui fonctionnerait à la place est:

B b = new B(A1.class);

ou

B b = new B(A.class); // class type expected and not the instance of

Pour expliquer plus en détail, le paramètre Class étend Une> variable signifie que extend A> est le type de la classe modélisée par l'objet Class fourni. Par conséquent, vous devez fournir soit la classe A , soit toute classe étendant A comme argument mais de type Class.


0 commentaires

5
votes

Je soupçonne que ce que vous essayez de faire est de configurer B afin qu'il puisse fonctionner avec des instances de A ou tout autre sous-type de A . Pour ce faire, vous devrez rendre la classe B elle-même générique:

class B<T extends A> {
    T variable;

    public B(T variable) {
        this.variable = variable;
    }
}

class C {
    public static void main(String args[]) {
        B<A> b = new B<>(new A());
        B<A1> b1 = new B<>(new A1());
    }
}


0 commentaires

3
votes

Classe étend A> variable signifie que la variable peut contenir une référence à un objet de type Class , pas à quelque chose qui étend A .

La Classe est une "méta-classe", son but est de décrire une autre classe. À partir d'une instance de Class , vous pouvez obtenir tous les champs et toutes les méthodes que cette classe fournit. Vous pouvez consulter le didacticiel réflexion Java pour plus d'informations.

Pour faire fonctionner votre code, vous pouvez écrire quelque chose comme ceci:

class B<T extends A> {
    private T variable;
    public B(T variable) {
        this.variable = variable;
    }
}

class C {
    public static void main(String args[]) {
        B<A> b = new B<>(new A());
        B<A1> b1 = new B<>(new A1());
    }
}

De cette façon, vous créez une classe générique B code> qui accepte les instances de A ou quelque chose qui étend A


0 commentaires