Caster un objet a une classe generique ? [JAVA] - Java - Programmation
Marsh Posté le 23-11-2010 à 17:12:18
ParadoX a écrit : Bonsoir,
|
C'est quoi le type de retour de la méthode qui contient ce code ? est-ce que ce type de retour est compatible avec la classe "blablabla" (c'est-dire la classe "blablabla" elle même ou une de ses super classes) ? Parce que peut-être que le prob ne vient pas du cast, mais du return ?
Marsh Posté le 23-11-2010 à 17:13:53
J'y ai pensé, mais le return type de la methode est un type dont le itemClass est derivé...
Marsh Posté le 23-11-2010 à 21:25:36
ParadoX a écrit : J'y ai pensé, mais le return type de la methode est un type dont le itemClass est derivé... |
Quel intérêt d'essayer de caster dans itemClass dans ce cas? Tu castes juste à la valeur de retour, ça va sortir comme ça de toute façon au final.
Marsh Posté le 23-11-2010 à 23:25:48
Pas vraiment, dans la mesure ou la classe d'au dessus est assez generique, disons. Imagine une classe mere "Formes" et en dessous ya "cercle" et "carré". Ca me sert a rien si j'arrive pas a retourner un cercle au lieu d'un objet "forme", tu vois ?
Marsh Posté le 23-11-2010 à 23:48:50
ParadoX a écrit : Pas vraiment, dans la mesure ou la classe d'au dessus est assez generique, disons. Imagine une classe mere "Formes" et en dessous ya "cercle" et "carré". Ca me sert a rien si j'arrive pas a retourner un cercle au lieu d'un objet "forme", tu vois ? |
Non, ça n'a pas de sens, si tu as:
Code :
|
ben tu vas sortir un Shape dans tous les cas, le cast sert strictement à rien. Et accessoirement le principe des types abstraits est justement de ne pas "retourner un cercle" dans la majorité des cas.
Marsh Posté le 24-11-2010 à 01:00:29
Comment faire si j'ai un objet dont je ne connais que la classe mere, et dans la fonction je determine sa vraie nature, et que je veux lui caster cela ?
Marsh Posté le 24-11-2010 à 07:56:15
ParadoX a écrit : Comment faire si j'ai un objet dont je ne connais que la classe mere, et dans la fonction je determine sa vraie nature, et que je veux lui caster cela ? |
Pas. Quelles actions veux tu donc faire sur ton objet si tu ne peux déterminer son type que dynamiquement?
Marsh Posté le 24-11-2010 à 09:20:58
C'est un peu plus complexe que ça. J'utilise une fonction de recherche d'une API a laquelle il faut que je donne une reference (string) et le type (sous forme de Class). J'ai donc fait une fonction qui me determine la Classe de l'objet recherché, que je pourrais ensuite donner a la fonction de recherche en parametre (et ça fonctionne). Seulement j'aimerais que le type de retour de la recherche soit de cette classe, au lieu d'etre une classe mere generique
Marsh Posté le 24-11-2010 à 13:33:42
Bon... mon objet de retour de ma fonction est du type generique, mais un getClass() dessus me donne la bonne. Maintenant je souhaiterais caster cet element a la classe que me donne getClass().
Comment faire ?
Marsh Posté le 24-11-2010 à 14:05:42
Hm je veux bien, mais ca ne marche pas:
Code :
|
ne me donnera pas accès aux methodes specifiques de monObject
Marsh Posté le 24-11-2010 à 14:08:20
En fait j'ai le meme probleme que ce gars la:
http://www.tek-tips.com/viewthread [...] 293&page=9
Citation : It seems so obvious. I send various types of objects through an object stream. When they get to the other side, they are read as Object obj = in.readObject() : type Object. I can easily get the name of the original class type via obj.getClass().getName() |
Marsh Posté le 24-11-2010 à 15:01:59
Perso je bougerais le handler (ou tout du moins la partie à overrider) dans la méthode de la superclasse, si tu as le contrôle sur tout le système, et les subclasses peuvent juste overloader la méthode au besoin.
Marsh Posté le 24-11-2010 à 15:18:52
Je n'ai justement pas controle des autres classes
Marsh Posté le 24-11-2010 à 19:15:44
Je vais schematiser Imaginons un projet avec des formes (carré et rond, au pif) heritées de Forme
J'utilise une fonction de recherche qui peut trouver des formes, mais en parametre il faut lui donner le type de forme cherché ainsi que sa reference (son numero, par ex):
Code :
|
Cette fonction me renvoie un objet de type Forme. Cet objet que je reçois, je sais qu'il s'agit en fait d'un carré (car c'est ce que j'ai dit de chercher a la fonction de recherche). Maintenant j'aimerais pouvoir utiliser les methodes speciales de la classe Carré, du coup j'aimerais caster cette "Forme" en "Carré".
Donc il faut que je caste maForme en typeDeForme. La ou ça se complique, c'est que typeDeForme change toujours, donc je ne pas harcoder le cast.
Quand je fais .getClass().getName() sur maForme, il me donne "Carré", par traduction. L'objet maForme, lui, est toujours du type Forme. Du coup je n'ai pas accès aux methodes de Carré, mais seulement de Forme.
C'est plus clair ?
Marsh Posté le 24-11-2010 à 19:26:32
ParadoX a écrit : Je vais schematiser Imaginons un projet avec des formes (carré et rond, au pif) heritées de Forme
|
Ça n'a toujours pas de sens, ton appel de méthode est statique, donc tu dois savoir statiquement que tu as un carré (parce que tu as fait un test positif juste avant), donc tout ton bricolage n'a aucun intérêt: ton cast ne peut qu'être hardcodé, puisque tes méthodes le sont.
ParadoX a écrit : L'objet maForme, lui, est toujours du type Forme. |
Non. Ton objet est de type Carré, ta référence par contre est sur une forme.
Marsh Posté le 24-11-2010 à 19:35:49
Donc je fais un switch geant sur typeDeForme avec toutes les formes possibles et je cast au cas par cas ?
Marsh Posté le 24-11-2010 à 19:48:14
ParadoX a écrit : Donc je fais un switch geant sur typeDeForme avec toutes les formes possibles et je cast au cas par cas ? |
Dans la mesure où Java est statiquement typé, n'a pas d'open classes, n'a pas d'extension methods et n'a pas de categories (au sens de Smalltalk), oui. Soit ça, soit tu te fais un tas d'adapters backés par les objets d'origine et tu manipules ça à la place du package qui fonctionne pas.
Marsh Posté le 24-11-2010 à 19:52:02
Reply
Marsh Posté le 23-11-2010 à 16:53:23
Bonsoir,
Question simple:
Le cast en rouge ne passe pas. Comment puis-je caster objects[0] au type itemClass (qui, lui, dépend directement de "blablabla" ) ?
L'interet d'un isInstanceOf est justement de pouvoir l'utiliser sans forcement connaitre le nom de la classe...
Merci
Update2:
Je vais schematiser Imaginons un projet avec des formes (carré et rond, au pif) heritées de Forme
J'utilise une fonction de recherche qui peut trouver des formes, mais en parametre il faut lui donner le type de forme cherché ainsi que sa reference (son numero, par ex):
Cette fonction me renvoie un objet de type Forme. Cet objet que je reçois, je sais qu'il s'agit en fait d'un carré (car c'est ce que j'ai dit de chercher a la fonction de recherche). Maintenant j'aimerais pouvoir utiliser les methodes speciales de la classe Carré, du coup j'aimerais caster cette "Forme" en "Carré".
Donc il faut que je caste maForme en typeDeForme. La ou ça se complique, c'est que typeDeForme change toujours, donc je ne pas harcoder le cast.
Quand je fais .getClass().getName() sur maForme, il me donne "Carré", par traduction. L'objet maForme, lui, est toujours du type Forme. Du coup je n'ai pas accès aux methodes de Carré, mais seulement de Forme.
C'est plus clair ?
Update:
Meme probleme que ce gars la:
http://www.tek-tips.com/viewthread [...] 293&page=9
It seems so obvious. I send various types of objects through an object stream. When they get to the other side, they are read as Object obj = in.readObject() : type Object. I can easily get the name of the original class type via obj.getClass().getName()
Now what I want is a very simple way of casting back to the original class type so that I can use overloaded handlers - i.e. one handler for each type that this application may receive. I've tried all day, but still can't find anything that works. Here's one thing I've tried.
try {
process2Input(obj.getClass().cast(Class.forName(rtm.getClass().getName())));
} catch (ClassNotFoundException e) {
}
As with other things, it still thinks it's Object class rather than its original class, which is given by getName()
Message édité par ParadoX le 24-11-2010 à 19:16:16
---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt