[JAVA] Caster un objet a une classe generique ?

Caster un objet a une classe generique ? [JAVA] - Java - Programmation

Marsh Posté le 23-11-2010 à 16:53:23    

Bonsoir,
 
Question simple:  

Code :
  1. Class itemClass = Class.forName("blablabla" );
  2. ...
  3. if (itemClass.isInstance(objects[0]))
  4. return (itemClass) objects[0];


 
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 :jap:
 
Update2:
 

Citation :

Je vais schematiser :D 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 :
  1. Forme maForme = rechercheDeForme(String typeDeForme, String reference)


 
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 ?  [:tinostar]


 
Update:  
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()
 
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 cité 1 fois
Message édité par ParadoX le 24-11-2010 à 19:16:16

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 23-11-2010 à 16:53:23   

Reply

Marsh Posté le 23-11-2010 à 17:12:18    

ParadoX a écrit :

Bonsoir,
 
Question simple:  

Code :
  1. Class itemClass = Class.forName("blablabla" );
  2. ...
  3. if (itemClass.isInstance(objects[0]))
  4. return (itemClass) objects[0];


 
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 :jap:


 
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 ?

Reply

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é...  
 


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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 :
  1. Shape getShape() {
  2.    return (Square) this.someShape;
  3. }


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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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 ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 24-11-2010 à 13:33:42   

Reply

Marsh Posté le 24-11-2010 à 13:57:38    

Class.cast() ?

Reply

Marsh Posté le 24-11-2010 à 14:05:42    

Hm je veux bien, mais ca ne marche pas:
 

Code :
  1. monObject.getClass().cast(monObject);


 
ne me donnera pas accès aux methodes specifiques de monObject :/


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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()
 
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()


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-11-2010 à 15:18:52    

Je n'ai justement pas controle des autres classes :/


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 24-11-2010 à 19:15:44    

Je vais schematiser :D 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 :
  1. Forme maForme = rechercheDeForme(String typeDeForme, String reference)


 
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 ?  [:tinostar]


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 24-11-2010 à 19:26:32    

ParadoX a écrit :

Je vais schematiser :D 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 :
  1. Forme maForme = rechercheDeForme(String typeDeForme, String reference)


 
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.


Ç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.


Message édité par masklinn le 24-11-2010 à 19:28:19

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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 ?  [:klemton]


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

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 ?  [:klemton]


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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-11-2010 à 19:52:02    

Merci pour ton aide :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed