java Generics - Comment appeler une méthode surchargée enfant en connaissant le type de classe enfant et la superclasse


Jean11

J'ai un tas de classes qui étendent une classe de base. La classe de base a une méthode dirons-nous:

doStuff1(int variable){ do something;}

Chacune de ces classes a:

doStuff1(String string) {convert string to number and call super.doStuff1(intResult)};

Dans une autre classe, méthode j'ai quelque chose comme:

public void bla(Class<?> childClass, SuperClass childClassInDisguise) {
    (childClass.cast(childClassInDisguise)).doStuff1(myString);
}

Je ne peux pas compiler ceci à cause de: La méthode doStuff1 (myString) n'est pas définie pour le type capture # 17-of?

Qu'est-ce que je fais de mal ici? Est-ce seulement possible ?

Merci.

vigne

Le compilateur ne sait pas à quelle classe cela représente,

Class<?>

et le seul indice qu'il connaisse en ce qui concerne l'objet est qu'il a une superclasse qui n'a que doStuff1 (int)

Si vous voulez vraiment appeler doStuff1 (String), pourquoi ne pas créer une autre sous-classe abstraite contenant cette méthode et marquée cette méthode comme abstraite. Les sous-classes existantes devraient étendre cette nouvelle sous-classe.

public abstract class NewSubclass extends Superclass {
  public void abstract doStuff1(String);
}

Ensuite, dans votre méthode, ajoutez un paramètre générique tel que

    public <T extends NewSubclass>void bla(Class<T> childClass, SuperClass childClassInDisguise) {
        (childClass.cast(childClassInDisguise)).doStuff1(myString); 
    }

De cette façon, le compilateur connaît l'héritage d'héritage de l'objet qui sont des sous-classes de la NewSubclass qui contient cette méthode abstraite.

ÉDITER

Si vous ne pouvez modifier que la méthode bla, essayez ceci,

public void bla(Class<?> childClass, SuperClass childClassInDisguise) {
      if(childClass.equals(ChildClass1.class) {
        (ChildClass1(childClassInDisguise)).doStuff1(myString);
     } else ... {
     } 
}

Faites de même si condition dans d'autres sous-classes connues. Je sais que c'est codé en dur, mais c'est le seul moyen si vous ne pouvez pas utiliser la superclasse générique + abstraite en modifiant les classes impliquées. Mais je préfère toujours ma première suggestion car elle est moins code et dynamique, comme lorsque vous ajoutez une autre sous-classe, vous n'avez pas à changer à nouveau de méthode bla (la puissance du POLYMORPHISME), contrairement à la deuxième suggestion. Il s'agit davantage d'un problème de reconstruction de conception.

Articles connexes