1
votes

Comment faire un polymorphisme avec sous-classe dans une superclasse?

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


7 commentaires

Un chien et un chat sont tous deux des animaux, mais vous essayez de: Dog dog = Cat.getCat ();


J'essaie Dog dog = Animal.getAnimal () car Dog est B et animal est A


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 de Dog 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 est APIResponse B est un autre type de APIResponse et C est un autre type de APIResponse , et le getA () n'est qu'une méthode pour créer un ApiResponse avec un code API particulier, car tous ont en commun ce code , mais ce n'est qu'une abstraction de ces problèmes


3 Réponses :


3
votes

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 .


0 commentaires

2
votes

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 .


0 commentaires

0
votes

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


0 commentaires