Bonjour j'ai les classes suivantes
B b = A.getA();
Et j'essaye de faire un polymorphisme de cette façon:
class A <T extends AnotherClass>{
public static A getA(){
return new A();
}
}
class B<T> extends A{}
class C<T> extends A{}
Mais je suis obtenant l'erreur suivante:
Les types incompatibles requite B trouvés A.
Comment puis-je faire cela?
Merci
3 Réponses :
Il est possible de faire
A b = nouveau B ();
mais pas l'inverse comme vous essayez de le faire.
En gros, vous ne pouvez mettre une sous-classe que dans une super mais pas une super dans une sous-classe .
Cela ne peut pas fonctionner . Il n'y a pas de polymorphisme impliqué avec les méthodes statiques. Ils n'existent que dans le contexte de la classe déclarante. Donc, getA retournera toujours une instance de A dans votre cas et ce ne sera jamais B.
Vous n'avez pas déclaré quel type le A sera en termes de génériques, mais c'est moins important.
En ce sens
B b = A.getA();
est un non-sens, car new A () ne sera jamais B .
Vous ne pouvez pas effectuer de polymorphisme , mais vous pouvez effectuer une réflexion .
Vous avez besoin d'une classe utilitaire:
A a = A.getA(); B b = new B(); ClassUtils.asSubclass( a, b );
Vous pouvez l'utiliser comme ceci:
public class ClassUtils {
public static <SUP, SUB extends SUP> void asSubclass( SUP superClass, SUB subClass ) {
for (Field field : superClass.getFields()) {
field.setAccessible(true);
field.set(subClass, field.get(superClass));
}
}
}
Un chien et un chat sont tous deux des animaux, mais vous essayez de: Dog dog = Cat.getCat ();
J'essaie
Dog dog = Animal.getAnimal ()carDogestBetanimalestAC'est la seule erreur que vous obtenez? donc vous voulez dire que public static getA () {return new A (); } compile?
Non, vous essayez
Dog dog = Animal.getAnimal ()au lieu deDog dog = Animal.getDog ()Je viens d'éditer maintenant, ce code n'est qu'un brouillon pour un autre morceau de code plus gros
@ Tlaloc-ES essayez-vous de créer dynamiquement une instance d'une classe, via cette méthode
statique?J'utilise une usine statique pour créer une classe particulière. Le vrai problème est que
AestAPIResponseBest un autre type deAPIResponseetC code > est un autre type deAPIResponse, et legetA ()n'est qu'une méthode pour créer unApiResponseavec un code API particulier, car tous ont en commun cecode, mais ce n'est qu'une abstraction de ces problèmes