Cast d'un objet de type classe passée en paramètre
J'ai une classe parent et 2 enfants de classes. Je suis en train de mettre en œuvre une fonction qui prend le type de l'enfant et qui l'enfant en tant que paramètres.
Lorsque j'utilise child.newInstance()
, je veux le stocker dans une variable de type qui est passé et appeler une fonction à partir de la deuxième paramètre.
Ci-dessous sont les classes
public class Parent {
public void test() {
System.out.println("Test from parent");
}
}
public class ChildA extends Parent {
public void testChildA() {
System.out.println("Test from child a");
}
}
public class ChildB extends Parent {
public void testChildB() {
System.out.println("Test from child b");
}
}
et voici la méthode que je suis en train de mettre en œuvre
public class Driver {
Parent func(Class child, String whichChild) throws Exception {
//whichChild: "ChildA" or "ChildB"
Object obj = child.newInstance();
//cast obj to type of child and call the method "test" and "test" + whichChild
}
}
Peut-il être fait à ce que je suis en train de faire? Si oui, comment puis-je lance cet objet au type qui est passé?
Que voulez-vous atteindre avec ce ? et pourquoi ne pas vous surcharger de test chez les enfants?
Je ne peux pas changer la structure des classes et je ne peux pas remplacer les méthodes, parce que l'enfant méthodes de faire d'autres fonctionnalités, j'ai ajouté le
Au moment de la compilation de la sécurité et de l'analyse statique sont très puissants et d'outils utiles, lors de l'utilisation de la réflexion de l'API, vous perdez tous les avantages qu'ils procurent. Vous ne savez pas si le code fonctionne jusqu'à ce que vous l'exécutez. Il ne sera pas possible de trouver des usages de l'méthodes vous appel à l'aide de la réflexion. Aussi IDE sera de rapports que les méthodes ne sont pas utilisés, ce qui ne sera pas vrai. Voir Andy Turner réponse quelle est la meilleure façon de faire quelque chose comme ça.
pouvez-vous ajouter de la méthode abstraite dans
Il semble comme un endroit parfait pour l'héritage. Pourquoi ne pouvez-vous pas modifier
Je ne peux pas changer la structure des classes et je ne peux pas remplacer les méthodes, parce que l'enfant méthodes de faire d'autres fonctionnalités, j'ai ajouté le
super.test();
par erreur, désoléAu moment de la compilation de la sécurité et de l'analyse statique sont très puissants et d'outils utiles, lors de l'utilisation de la réflexion de l'API, vous perdez tous les avantages qu'ils procurent. Vous ne savez pas si le code fonctionne jusqu'à ce que vous l'exécutez. Il ne sera pas possible de trouver des usages de l'méthodes vous appel à l'aide de la réflexion. Aussi IDE sera de rapports que les méthodes ne sont pas utilisés, ce qui ne sera pas vrai. Voir Andy Turner réponse quelle est la meilleure façon de faire quelque chose comme ça.
pouvez-vous ajouter de la méthode abstraite dans
Parent
classe?Il semble comme un endroit parfait pour l'héritage. Pourquoi ne pouvez-vous pas modifier
Parent
classe?OriginalL'auteur hakuna matata | 2015-11-06
Vous devez vous connecter pour publier un commentaire.
Si vous ajoutez une contrainte à
child
, vous n'avez pas besoin d'un plâtre à tout pour obtenir un Parent:Cependant, vous ne pouvez pas appeler le
testChildA
etc méthode, car tout ce que vous avez est une instance deParent
. Vous devez utiliser la réflexion pour obtenir la méthode:Il serait préférable de disposer d'une méthode sur l'interface de
Parent
que vous pouvez invoquer, et est remplacé dans les sous-classes.puis il suffit d'appeler:
ou, comme Emanuele Ivaldi points, il suffit de remplacer
test
dansChildA
etChildB
et d'appeler directement.testChildA
même siobj
estParent
dansParent obj = child.newInstance();
?Assurez-vous - vous pouvez - mais cela ne signifie pas qu'il est garanti pour fonctionner.
Method
est découplée de l'instance qui l'invoque. Par exemple, vous pourriez l'appelermethod.invoke("string")
- qui aura pour résultat une exception d'exécution. C'est à vous de vous assurer que vous ne vous appelez cela dans une manière qui fait sens.L'alternative serait de vérifier la classe de l'objet et de le jeter à la mise en œuvre correcte et d'appeler la bonne méthode, il n'est pas souple,elle le suce, mais il évite l'utilisation de la réflexion, j'ai dit ça craint?
OriginalL'auteur Andy Turner
Vous ne savez pas exactement ce que vous faites, mais vous pouvez utiliser
Class.cast(...)
.Par exemple
return type.newInstance()
serait plus simple.D'accord, Im juste essayer de montrer l'utilisation de
Class.cast(Object)
OriginalL'auteur lance-java
Essayer celui-ci.
child
en paramètre alors? Il aide si vous mettez en avant ce que vous avez réellement changé, plutôt que de simplement dire "essayez ce bloc de code sans explication".Je suis d'accord avec ce monsieur. D'éditer ma réponse, merci 🙂
OriginalL'auteur Discern
J'en doute. Aussi loin que le compilateur préoccupations, toute instance de Classe peut être envoyé en paramètre.
Donc, pour le compilateur, il n'y a aucune preuve que cette instance est une instance du type que vous envoyez.
Class<? extends Parent>
contraintes.oui, mais avez-vous le type exact, alors?
OriginalL'auteur Stultuske