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?
3 Réponses :
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
.
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()); } }
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
Vous transmettez des instances au lieu des classes. Passez les classes ou modifiez la signature pour accepter les instances à la place.