Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1421 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Caster un objet a une classe generique ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[JAVA] Caster un objet a une classe generique ?

n°2037863
ParadoX
Posté le 23-11-2010 à 16:53:23  profilanswer
 

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
mood
Publicité
Posté le 23-11-2010 à 16:53:23  profilanswer
 

n°2037866
leonhard
Posté le 23-11-2010 à 17:12:18  profilanswer
 

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 ?

n°2037867
ParadoX
Posté le 23-11-2010 à 17:13:53  profilanswer
 

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
n°2037938
masklinn
í dag viðrar vel til loftárása
Posté le 23-11-2010 à 21:25:36  profilanswer
 

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
n°2037951
ParadoX
Posté le 23-11-2010 à 23:25:48  profilanswer
 

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
n°2037955
masklinn
í dag viðrar vel til loftárása
Posté le 23-11-2010 à 23:48:50  profilanswer
 

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
n°2037965
ParadoX
Posté le 24-11-2010 à 01:00:29  profilanswer
 

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
n°2037970
masklinn
í dag viðrar vel til loftárása
Posté le 24-11-2010 à 07:56:15  profilanswer
 

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
n°2037990
ParadoX
Posté le 24-11-2010 à 09:20:58  profilanswer
 

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
n°2038065
ParadoX
Posté le 24-11-2010 à 13:33:42  profilanswer
 

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
mood
Publicité
Posté le 24-11-2010 à 13:33:42  profilanswer
 

n°2038070
treponempa​l
poète à ses heures
Posté le 24-11-2010 à 13:57:38  profilanswer
 

Class.cast() ?

n°2038075
ParadoX
Posté le 24-11-2010 à 14:05:42  profilanswer
 

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
n°2038077
ParadoX
Posté le 24-11-2010 à 14:08:20  profilanswer
 

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
n°2038085
masklinn
í dag viðrar vel til loftárása
Posté le 24-11-2010 à 15:01:59  profilanswer
 

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
n°2038101
ParadoX
Posté le 24-11-2010 à 15:18:52  profilanswer
 

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


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°2038184
ParadoX
Posté le 24-11-2010 à 19:15:44  profilanswer
 

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
n°2038185
masklinn
í dag viðrar vel til loftárása
Posté le 24-11-2010 à 19:26:32  profilanswer
 

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
n°2038188
ParadoX
Posté le 24-11-2010 à 19:35:49  profilanswer
 

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
n°2038190
masklinn
í dag viðrar vel til loftárása
Posté le 24-11-2010 à 19:48:14  profilanswer
 

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
n°2038191
ParadoX
Posté le 24-11-2010 à 19:52:02  profilanswer
 

Merci pour ton aide :jap:


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [JAVA] Caster un objet a une classe generique ?

 

Sujets relatifs
[Java]Petit problème interface graphique[Java] Threads et IPC : meilleure solution ?
Xlam + ClasseCompilation Flex+Java
Récupérer l'objet a sur lequel on cliquerepresentation d'un objet c++ en asm
problème de Thread javaSpinnerAdapter générique
[resolu]tableau d'objet dans une classe (et ca marche pas bien sur) 
Plus de sujets relatifs à : [JAVA] Caster un objet a une classe generique ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR