Typage des variables

Signaler
Messages postés
35
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2016
-
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
-
Bonjour, j'ai un problème compliqué. Peut être pourrai-je trouver de l'aide parmis vous.

Je m'explique : je voudrais fabriquer un objet sans avoir à spécifier son type en dur lorque que je tape mon code.

Exemple :
Je tape une classe :

public class toto{
public String bob = new String("bob");
/* type */ socket;
}

est ce que l'on peut utiliser la classe Class pour faire un typage, ou alors on doit forcément le faire en dur.

En fait l'objet que je recois viens d'une Hashtable, il est donc de type Object.
Mon probleme est que je voudrais pouvoir lui appliquer ses méthodes.
Seulement, au moment ou je recois mon objet de ma Hashtable, son type est dynamique(a l'instant i, c'est une socket et a l'instant j c'est une JFrame) en exagérant.

Donc grande question comment typer dynamiquement

j'ai essayé des (object.getClass())object = object; mais ca marche pas...

Donc je suis desespere et je sais pas comment faire

Merci de votre aide

5 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
131
Si tout tes objets ont des propriétés communes (par exemple : si ca peut être un chien, un chat, un cheval ou une poule, tous peuvent marcher, courir, manger, etc., et ils peuvent être vu comme des animaux), alors je te conseille d'utiliser une interface animal qui sera implémenté par tes quatres classes (chien, chat, etc.), et ainsi, tu pourra facilement appliquer des fonctions sur le type animal et non plus chien, chat, etc. C'est l'approche objet de java au niveau du polymorphysme.

_____________________________________________________________________
Messages postés
35
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2016

Le probleme est que l'objet peut aussi bien etre une socket ou alors une JFrame ou alors un AbstractDocument...



C'est ca le probleme :(



C'est pour ca que je voudrais savoir si on peut faire un typage dynamique.

Merci pour ta reponse :)
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,



tu peux t'aider de l'objet Class et des classes de réflexion (ref:java.lang.reflect.*)

WORA
Messages postés
35
Date d'inscription
mercredi 5 octobre 2005
Statut
Membre
Dernière intervention
24 octobre 2016

J'ai deja essayé...

A tu une idée précise de ce qu'il faudrai faire Wora ou alors aucunes?
Messages postés
5365
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
12 août 2021
111
Salut,



voici deux exemple différent en esperenant que cela te donne une idée de ce que tu peux faire

(pour la deuxieme methode je ne me sert que des constructeurs par defaut)



import java.lang.reflect.Method;



import javax.swing.JDialog;

import javax.swing.JFrame;



public class Test {



public Test(Object obj){

if(obj instanceof JFrame){

((JFrame)obj).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

((JFrame)obj).setSize(300,300);

((JFrame)obj).setLocationRelativeTo(null);

((JFrame)obj).setVisible(true);

}else if(obj instanceof JDialog){

((JDialog)obj).setTitle("JDialog 1");

((JDialog)obj).setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);

((JDialog)obj).setSize(300,300);

((JDialog)obj).setLocationRelativeTo(null);

((JDialog)obj).setVisible(true);

}else if(obj instanceof StringBuilder){

((StringBuilder)obj).append("hello");

((StringBuilder)obj).append(" world");

System.out.println((StringBuilder)obj);//implicite

}else{

System.out.println("Il n'y a pas de correspondance");

}



}





public static void main(String[] args) {

JFrame f = new JFrame("Frame 1");

JDialog d = new JDialog();

StringBuilder s = new StringBuilder("");

new Test(f);

new Test(d);

new Test(s);



jframe();

jdialog();

}



private static void jframe(){

try {

//chope la classe

Class c = Class.forName("javax.swing.JFrame");

//creer une instance sur la classe

Object frame = c.newInstance();



//Ajoute un titre

Method m =
frame.getClass().getMethod("setTitle", new Class[]{String.class});

//invocation de la methode avec le petit titre

m.invoke(frame,new Object[]{"JFrame 2"});



//pour fermer la fenetre :)

m =
frame.getClass().getMethod("setDefaultCloseOperation", new
Class[]{int.class});

m.invoke(frame,new Object[]{JFrame.EXIT_ON_CLOSE});



//une petite taille pour le plaisir

m =
frame.getClass().getMethod("setSize", new Class[]{int.class,
int.class});

m.invoke(frame,new Object[]{300,300});



//affiche la fenetre

m =
frame.getClass().getMethod("setVisible", new Class[]{boolean.class});

m.invoke(frame,new Object[]{true});

}catch (Exception e) {

e.printStackTrace();

}

}



private static void jdialog(){

try {

//chope la classe

Class c = Class.forName("javax.swing.JDialog");

//creer une instance sur la classe

Object dialog = c.newInstance();



//Ajoute un titre

Method m =
dialog.getClass().getMethod("setTitle", new Class[]{String.class});

//invocation de la methode avec le petit titre

m.invoke(dialog,new Object[]{"JDialog 2"});



//pour fermer la fenetre :)

m =
dialog.getClass().getMethod("setDefaultCloseOperation", new
Class[]{int.class});

m.invoke(dialog,new Object[]{JDialog.EXIT_ON_CLOSE});



//une petite taille pour le plaisir

m =
dialog.getClass().getMethod("setSize", new Class[]{int.class,
int.class});

m.invoke(dialog,new Object[]{300,300});



//affiche la fenetre

m =
dialog.getClass().getMethod("setVisible", new Class[]{boolean.class});

m.invoke(dialog,new Object[]{true});

}catch (Exception e) {

e.printStackTrace();

}

}



}




WORA