2010-11-24 3 views
0

Cela semble si évident. Comment puis-je lancer un objet myObjet au type myObjet.getClass? J'ai essayé des combinaisons de forName(), cast et autres ... aucun ne semble fonctionner: sCoulée dynamique:

Le problème est que j'ai une liste d'objets et je voudrais les ramener à leur type d'origine (qui est donné par myObjet.getClass.getName()).

Cordialement, Tim


Oui, c'est Java et il est certainement pas tort. Laissez-moi vous expliquer le problème. Imaginez un programme qui traite des formes simples comme les carrés et les cercles qui sont des classes dérivées de Form, la classe principale.

Donc il y a une fonction de recherche qui renvoie un formulaire, mais vous devez fournir le type et une référence de la forme (un numéro, par exemple):

Form myForm= searchForm(String formType, String formRef) 

Je sais ce que le formulaire retourne va être parce que j'ai donné ces arguments à la fonction de recherche: un carré, par exemple. L'objet retourné sera toujours un formulaire, mais je veux qu'il soit de la classe Square, donc j'ai besoin de le lancer. Il est compatible car Square hérite de Form.

Le seul problème est que "formType" est variable, il pourrait bien être Square, mais il pourrait aussi être "Circle". C'est pourquoi j'ai besoin d'une distribution générique pour l'objet de retour.

Si je fais un myForm.getClass(). GetName(), j'obtiens "Square". J'ai donc besoin de lancer myForm sur myForm.getClass().

Voyez-vous le problème?

+2

Quelle langue est-ce? –

+0

Cela semble être une sorte de (mauvais) Java. De plus, je ne comprends pas le chemin. Pouvez-vous s'il vous plaît expliquer? – dmeister

Répondre

0

La diffusion ne modifie pas l'objet lui-même. La conversion modifie uniquement ce que le compilateur vous permet de faire avec l'objet. Java propose deux façons de décrire ce que vous pouvez faire avec un objet: les classes et les interfaces. La chose que vous lancez doit être quelque chose que le compilateur connaît au moment de la compilation. Sinon, le compilateur ne peut pas vous empêcher de faire quelque chose de stupide, comme essayer d'écrire myCircle.bark().

Vous avez donc deux choix: si les classes ont quelque chose en commun (une interface implémentée, ou une classe dont elles dérivent toutes), vous pouvez essayer d'utiliser cette description commune. Mais on dirait que ce n'est pas ce que tu veux. Au lieu de cela, les forces Java vous à faire est d'avoir une chaîne de if/else déclarations, qui tentent de jeter votre objet à chaque classe concrète que vous voudrez peut-être faire quelque chose avec, comme Square, Circle, etc.

Mais en jetant un objet à sa propre classe n'a pas de sens, car il ne donne au compilateur aucune information au moment de la compilation sur les méthodes que l'objet a ou n'a pas.

+0

Très bien - merci! – Tim