comment je peux faire un cast automatique sans pour autant spécifier le type de la variable en dure . à mon sens je devrais utilisé la réflexion !!!!
Version imprimable
comment je peux faire un cast automatique sans pour autant spécifier le type de la variable en dure . à mon sens je devrais utilisé la réflexion !!!!
Probablement, oui, mais...
- Comment un cast peut-il être autre chose qu'automatique ?
Tu as l'intention de lire le programme à haute voix et faire prendre des notes à une armée de scribes pour consigner l'état de la mémoire et les changements qui y sont faits ? (Auquel cas, effectivement, ce n'est pas automatique.)
- À quoi ça te sert de faire un cast si tu ne connais pas le type à l'avance ?
(Si si, ça peut bel et bien servir dans certaines circonstances... Mais je me demandais si toi, tu en connaissais.)
D’abord je vous remercie d’avoir répondu à mon problème .
En faite j’ai le moyen de connaitre le type de la variable sans pour autant l’écrire en dure : c’est via une requête , vue que j’ai une table qui centralise les types de mes variables qui sont toutes stockées sous format String .
Ce que je veux réalisé est le suivant :
1- récupérer la variable qui est stockée sous format string , et qui peut être un Integer par exemple .
2- invoquer la requête que je vous ai cité au-dessus pour connaitre le type de la variable dans ce cas elle va me retourner Integer.
3- enfin je dois faire un cast sans écrire Integer en dure .
À mon niveau je pense que la réflexion de java peut faire la faire ! vraiment si vous pouvez me communiquer des idées ou des pistes je te serais reconnaissant . Encore merci de tout cœur pour l’intérêt que vous avez porté à mon problème.
Salut,
Avec la reflection je dirais Class.cast()...
Mais ca dépend surtout de l'usage que tu vas en faire, et sans plus de détail sur le contexte difficile de t'aider...
a++
Tu te rends compte que le cast, ça sert à préciser à java que la variable, stocké dans le champ x de type A, peux être stocké dans le champs y de type B
Sans écrire B en dure dans le code, tu m'explique comment tu es arrivé à créer le champs / la variable y ??
J'ai l'impression que tu imagine que le cast peux transformer une String en Integer. Ce n'est pas le cast. Le cast ne fait que demander à la jvm si, quelque chose que tu as supposé à la compilation (exemple que ton Object est un Integer) est toujours vrai à l'exécution (donc que ton object ne contient pas en réalité un String ou un Byte).
Oui donc tu veux faire une conversion de String vers int. Rien à voir avec un cast.
Eh bien ce n'est pas le cas.
Il va falloir que tu crées un "convertisseur" pour chaque genre de conversion "string vers quelque chose" que tu veux faire.
Rien ne t'empêche ensuite de faire en sorte que chacun de ces convertisseurs implémentent la même interface, et de garder une instance de chaque dans une Map<String, Convertisseur> indexée par le nom du type à convertir comme tu le récupères de ta database.
2 remarques :
1 - ce que tu veux faire, ce n'est pas un cast. C'est transformer un String en Integer (ou autre chose). Pour cela, il faut faire une (ou plusieurs) fonction qui prendra en parametre le String et renverra l'instance correspondante du type voulu.
2 - Tu veux un Integer sans ecrire Integer en dur. Un cast n'a d'interet que si c'est pour utiliser l'instance en question. Or, pour l'utiliser, tu as bien besoin d'ecrire son type. Bref, il faudrait preciser comment tu l'utilises parce que la, c'est pas clair du tout (et, j'ai l'impression, meme dans ta tete).
d'abord merci tout le monde pour de de m'avoir accordé du temps je suis vraiment reconnaissant .
je reconnais avoir tord vue que j'ai mélangé entre casting et conversion.
concernant votre proposition Thelvin , j'ai trouvé que c'est une excellente suggestion c'est pour cette raison que je l'ai testée mais apparemment je suis tombé dans le même problème qu casting : voilà le code source
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public class Test2 { private static Map<String, Convertisseur> mapConvertisseur; public static void main(String[] agrs){ intMapConvertisseur(); String vleur = "33"; String typeValeur="Intger"; // ici il me souligne cette instruction en rouge pour me dire que je dois fair / un cast , donc je suis tombé dans le même problème vous voyez ! Integer valeurInteger = mapConvertisseur.get(typeValeur).getValue(vleur); } private static void intMapConvertisseur(){ mapConvertisseur = new HashMap<String, Convertisseur>(); mapConvertisseur.put("Integer", new ConvertisseurStringIToInteger()); } }
Code:
1
2
3
4
5 interface Convertisseur { public Object getValue(String value ); }
Merci d'avance.Code:
1
2
3
4
5
6
7
8
9
10 class ConvertisseurStringIToInteger implements Convertisseur { @Override public Object getValue(String value) { Integer integerValue = Integer.parseInt(value); return integerValue; } }
Ben oui tu dois faire un cast. valeurInteger est défini comme un Integer, donc tu dois caster.Code:
1
2
3 // ici il me souligne cette instruction en rouge pour me dire que je dois fair / un cast , donc je suis tombé dans le même problème vous voyez ! Integer valeurInteger = mapConvertisseur.get(typeValeur).getValue(vleur);
Quel est le problème à cela ?
a++
Pour cette exemple j’ai pas de problème vue que je connais le type de valeurInteger en écrivant le code source mais dans mon cas réel et vue que je travaille avec talend open suite tous ce que je peux connaitre en écrivant le code source dans talend c’est la valeur de la variable stockée sous forme String et le type de cette valeur stocké lui aussi sous format String c’est pour cette raison je veux faire un cast automatique .
Dans ce cas montre un exemple concret de ce cas là.
Parce que si tu dis ne pas connaitre le type, je vois mal comment tu pourrais l'utiliser !
a++
Au cas où ça ne soit pas clair : on est en train de t'expliquer que ton problème n'existe pas.
- Si tu as besoin d'exploiter le type de l'objet à récupérer : c'est un cast parfaitement normal. Il est nécessaire et suffisant. Pas besoin de chercher plus loin.
- Si tu n'as pas ce besoin : alors tu n'as pas besoin d'un cast, ni de quoi que ce soit d'autre.
Il veut pouvoir instancier une classe d'après son nom, qu'il récupère sous forme de String.