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 ()
carDog
estB
etanimal
estA
C'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
A
estAPIResponse
B
est un autre type deAPIResponse
etC code > est un autre type de
APIResponse
, et legetA ()
n'est qu'une méthode pour créer unApiResponse
avec un code API particulier, car tous ont en commun cecode
, mais ce n'est qu'une abstraction de ces problèmes