constructeur d'un type générique [Résolu : pas possible]

constructeur d'un type générique [Résolu : pas possible] - Java - Programmation

Marsh Posté le 20-12-2004 à 14:36:58    

:hello:
 
Voilà mon problème, je commence à faire joujou avec les generics, et c'est franchment bougrement pratique, mais je coince :/
 
Voilà mes classes bidons :
 
Vehicule :

public class Vehicule {
 public Vehicule() {
  System.out.println("nouveau véhicule" );
 }
 public void rouler() {
  System.out.println("Vehicule : roule" );
 }
}


 
Voiture :

public class Voiture extends Vehicule {
 public Voiture() {
     super();
  System.out.println("nouvelle voiture" );
 }
 public void demarrer() {
  System.out.println("Vroum" );
 }
}


 
Velo :

public class Velo extends Vehicule {
 public Velo() {
     super();
  System.out.println("nouveau vélo" );
 }
}


 
là où j'ai un bleme :
Personne :

Code :
  1. public class Personne<V extends Vehicule> {
  2. public V vehicule;
  3. public Personne() {
  4.     // la ligne suivante passe pas
  5.  //vehicule = new V();
  6. }
  7. }


 
Ma classe principale :

public class TestGenerics {
 
 public static void main(String[] args) {
  Personne<Velo> p2=new Personne<Velo>();
  Personne<Voiture> p3=new Personne<Voiture>();
  p3.vehicule.demarrer();
 }
}


 
Bien sûr ça me sort un NullPointerException :D!
 
Si j'ajoute

p3.vehicule=new Voiture();

, là ça marche bien, mais bon l'intérêt est moyen :/
J'aurai aimé instancié le type paramétré V dans la classe Personne, mais ça bloque :/
 
Quelqu'un a une idée de comment ça marche ?


Message édité par bobuse le 21-12-2004 à 09:22:12
Reply

Marsh Posté le 20-12-2004 à 14:36:58   

Reply

Marsh Posté le 20-12-2004 à 14:44:37    

J'ai trouvé un topic sur java forums qui a l'air de traiter des même trucs, ça n'a pas l'air trivial ... :/
http://forum.java.sun.com/thread.j [...] &tstart=15

Reply

Marsh Posté le 20-12-2004 à 14:56:36    

ca me parait logique que ca marche pas : tu ne peux pas savoir si ton type générique a un constructeur vide => tu ne peux pas construire d'objet de ton type générique ... à vérifier, mais ca me parait assez évident. Sans dire que si ca se trouve, c'est une interface ce type ...
 
faut le passer en paramètre dans le constructeur ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 14:57:19    

benou a écrit :

ca me parait logique que ca marche pas : tu ne peux pas savoir si ton type générique a un constructeur vide => tu ne peux pas construire d'objet de ton type générique ... à vérifier, mais ca me parait assez évident. Sans dire que si ca se trouve, c'est une interface ce type ...
 
faut le passer en paramètre dans le constructeur ...


 
 
c'est un peu concon, non ?
pourrait pas lever une exception au runtime ? Voir meme a la compilation verifier si le code est valide ?


Message édité par chrisbk le 20-12-2004 à 14:57:44
Reply

Marsh Posté le 20-12-2004 à 15:02:33    

chrisbk a écrit :

c'est un peu concon, non ?


je trouve pas
 

chrisbk a écrit :

pourrait pas lever une exception au runtime ?


si mais bon, tu trouverais ca bien toi ? sans dire qu'elle serait imprédictible ...
 

chrisbk a écrit :


Voir meme a la compilation verifier si le code est valide ?


bha non, c'est pas dans le schema de compile de vérifier que l'intérieur des méthode des classes utilisés pas de "code interdit" ...
 
pense simplement au cas où le type générique est typé avec une interface : ca aurait aucun sens. C'est pas comme ca qu'il faut se servir des geneic c'est tout [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 15:04:31    

benou a écrit :

je trouve pas


 
bin je trouve que ca restreint le champ d'application
 
 
 

Citation :

bha non, c'est pas dans le schema de compile de vérifier que l'intérieur des méthode des classes utilisés pas de "code interdit" ...


 
bin il verifie bien l'heritage du type generique, pourquoi il verifierait pas les fonctions & cie ?
 
 

Citation :

pense simplement au cas où le type générique est typé avec une interface : ca aurait aucun sens. C'est pas comme ca qu'il faut se servir des geneic c'est tout [:spamafote]


 
habitude du c++....

Reply

Marsh Posté le 20-12-2004 à 15:07:09    

chrisbk a écrit :

bin il verifie bien l'heritage du type generique, pourquoi il verifierait pas les fonctions & cie ?


parce que il s'appuit sur la signature des classes, pas sur leur contenu ...  
 

chrisbk a écrit :

habitude du c++....


mauvaise habitude, changer habitude


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 15:09:54    

Citation :

parce que il s'appuit sur la signature des classes, pas sur leur contenu ...


 
d'accord, et en ton ame et conscience, tu trouves pas ca un peu dommage ?

benou a écrit :


mauvaise habitude, changer habitude


 
heuh je pense pas non, de ce coté la le C++ offre un certains nombre d'avantage en terme de reduction de taille de code et autre. Il lui manque les contraintes sur les types (genre machin derive de paul), mais pour d'autre truc il enfonce bien java (et le futur c#). C'est pas forcement toujours sexy, comme code, mais c'est foutrement puissant.


Message édité par chrisbk le 20-12-2004 à 15:10:37
Reply

Marsh Posté le 20-12-2004 à 15:09:57    

benou> Je suis d'accord avec toi avec le risque d'avoir une interface, mais puisque que mon type paramétré hérite d'une classe, une vraie, on pourrait se dire que ... mouaif je sais pas

Reply

Marsh Posté le 20-12-2004 à 15:11:19    

bobuse a écrit :

benou> Je suis d'accord avec toi avec le risque d'avoir une interface, mais puisque que mon type paramétré hérite d'une classe, une vraie, on pourrait se dire que ... mouaif je sais pas


 
 
on peut rien se dire du tout, il peut pas savoir a la compil (ou plutot il cherche pas a savoir) que l'objet que tu lui donne en param possede bien un constructeur sans parametres, donc il boude.

Reply

Marsh Posté le 20-12-2004 à 15:11:19   

Reply

Marsh Posté le 20-12-2004 à 15:15:15    

chrisbk a écrit :


d'accord, et en ton ame et conscience, tu trouves pas ca un peu dommage ?
 
heuh je pense pas non, de ce coté la le C++ offre un certains nombre d'avantage en terme de reduction de taille de code et autre. Il lui manque les contraintes sur les types (genre machin derive de paul), mais pour d'autre truc il enfonce bien java (et le futur c#). C'est pas forcement toujours sexy, comme code, mais c'est foutrement puissant.


bha comme toujours en java, c'est va moins loin que le C++ mais c'est plus simple.
 
on peut se dire que c'est dommage, etc ... moi je préfère voir comment utiliser le truc plutot que de m'imaginer comment ca aurait pu être...
Je me dis aussi que des tas de gens plus inteligents que moi ont fait le truc comme ca en connaissance de cause ...
 
faut dire aussi que je connais assez mal le C++ => j'ai pas vraiment de point de comparaison [:skeye]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 15:18:22    

benou a écrit :

bha comme toujours en java, c'est va moins loin que le C++ mais c'est plus simple.


 
a ce propos, y'en a qui rale parce que la syntaxe de java 1.5 est devenue toute laide (le foreach craignos, le @interface caca), t'en pense quoi ? [:joce] c'est dommage de passer d'un langage super verbeux (class prout extends roger implements paul) a un truc horrible (for(prout : pomme)), quand meme...
 
 

Citation :

faut dire aussi que je connais assez mal le C++ => j'ai pas vraiment de point de comparaison [:skeye]


 
les templates en C++ portent bien leur nom : ca te fais de gros bloc de code qui seront dupliqués a la compilation suivant les params que tu leur file. Ca ressemble pas exactement a la methode java, mais c'est diablement efficace.
 
 

Reply

Marsh Posté le 20-12-2004 à 15:24:07    

chrisbk a écrit :

a ce propos, y'en a qui rale parce que la syntaxe de java 1.5 est devenue toute laide (le foreach craignos, le @interface caca), t'en pense quoi ? [:joce] c'est dommage de passer d'un langage super verbeux (class prout extends roger implements paul) a un truc horrible (for(prout : pomme)), quand meme...


je me suis aps encore amusé à tester les nouveauté du jdk1.5. pour tout dire, au boulot j'en suis encore au jdk1.3 :/
 
Mais c'est clair que dès le début, j'ai eu un peu peur que la "facilité" de codage du java soit un peu ébranlé à cause de ses nouveautés ... on verra avec le temps ... mais rien que la nouvelle geule de la javadoc des types génériques me plait pas du tout par exemple ...
 

chrisbk a écrit :


les templates en C++ portent bien leur nom : ca te fais de gros bloc de code qui seront dupliqués a la compilation suivant les params que tu leur file. Ca ressemble pas exactement a la methode java, mais c'est diablement efficace.


ouais ca je savait mais c'est totu ce que je savais :)
je l'ai jamais trop vu utilisé, et je l'ai jamais fait moi même => je peux pas mesurer l'utilité du truc. je sais juste que ca permet de faire bcp de choses, comme un peu tout en C++ : tu peux totu faire, mais c'est la merde à comprendre.
 
edit : à quand un inner-marequote ??


Message édité par benou le 20-12-2004 à 15:25:06

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 15:31:21    

chrisbk a écrit :

a ce propos, y'en a qui rale parce que la syntaxe de java 1.5 est devenue toute laide (le foreach craignos, le @interface caca), t'en pense quoi ? [:joce] c'est dommage de passer d'un langage super verbeux (class prout extends roger implements paul) a un truc horrible (for(prout : pomme)), quand meme...


 
Perso, pour l'instant ça me parait super séduisant de plus avoir recastage de partout grâce au templates, c'est pour ça que j'essaie de bien comprendre comment ça marche, mais c'est vrai que plus j'apprends plus je me dis que ça n'a pas grand chose à voir avec le C++, à part la syntaxe ;)

Reply

Marsh Posté le 20-12-2004 à 15:38:24    

bobuse a écrit :

Perso, pour l'instant ça me parait super séduisant de plus avoir recastage de partout grâce au templates


 
 
ca, c'est pas du luxe, parce que les liste de "object", beurf beurf

Reply

Marsh Posté le 20-12-2004 à 15:38:48    

bobuse a écrit :

plus j'apprends plus je me dis que ça n'a pas grand chose à voir avec le C++, à part la syntaxe ;)


 
ca on avait été prévenu dès le début ...


Message édité par benou le 20-12-2004 à 15:39:19

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 15:39:35    

non rien [:joce]


Message édité par chrisbk le 20-12-2004 à 15:39:48
Reply

Marsh Posté le 20-12-2004 à 15:39:55    

chrisbk a écrit :

tu reponds a qui la ?


edited :o
t'as posté trop vite ;)
 
edit : trop tard [:joce]


Message édité par benou le 20-12-2004 à 15:40:25

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-12-2004 à 15:40:11    

pareil pour toi [:ddr555]

Reply

Marsh Posté le 20-12-2004 à 15:42:56    

chrisbk a écrit :

pareil pour toi [:ddr555]


ouais mais moi je t'ai [:quoted] ta tête :na:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-12-2004 à 09:21:52    

Bon, pour clore ce sujet, voilà la réponse expliquée sur la FAQ de Bruce Eckel :
http://www.langer.camelot.de/Gener [...] rameter%3F
 
Conclusion : j'ai encore beaucoup à apprendre des nouvelles features de Tiger :)
Prochaine étape, les meta-tags :)

Reply

Marsh Posté le 21-12-2004 à 11:11:49    

c'est plutot la faq d'angelika :o
Elle dis exactement la même chose que moi ... tu crois plus angelika que moi :'(


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-12-2004 à 14:18:06    

benou a écrit :

c'est plutot la faq d'angelika :o


oups :D m'a trompé
EDIT : en fait c'est parce que je suis tombé sur cette FAQ à partir des tuts de Eckel :
http://www.mindview.net/WebLog/log-0061

benou a écrit :


Elle dis exactement la même chose que moi ... tu crois plus angelika que moi :'(


Meuh non, mais en plus il y a un exemple, et puis c'est en anglais, ça fait plus sérieux ;)
Tu avais raison depuis le début, mais cette FAQ m'a permis de mieux comprendre :)


Message édité par bobuse le 21-12-2004 à 14:20:20
Reply

Marsh Posté le 21-12-2004 à 14:22:55    

ste vieille magouille a la reflexion :o

Reply

Marsh Posté le 21-12-2004 à 14:27:58    

Voilà ce que ça donne :D
Mais c'est clair que c'est magouillé [:ooooo]

Code :
  1. public class Personne<V extends Object> {
  2. public V vehicule;
  3. public Personne(Class<V> vClass) {
  4.     try {
  5.             vehicule=(V)vClass.newInstance();
  6.         } catch (InstantiationException e) {
  7.             // TODO Auto-generated catch block
  8.             e.printStackTrace();
  9.         } catch (IllegalAccessException e) {
  10.             // TODO Auto-generated catch block
  11.             e.printStackTrace();
  12.         }
  13. }
  14. }


Reste plus qu'à traiter les exception :whistle:
 
Et mon main bidon devient :

Code :
  1. public static void main(String[] args) {
  2.     Personne<Velo> p2=new Personne<Velo>(Velo.class);
  3.  Personne<Voiture> p3=new Personne<Voiture>(Voiture.class);
  4.  p3.vehicule.demarrer();
  5. }


Message édité par bobuse le 21-12-2004 à 14:28:21
Reply

Marsh Posté le 21-12-2004 à 14:31:59    

c'est trop naze le coup du Class et newInstance !
passe lui son véhicule en paramètre du constructeur !


Message édité par benou le 21-12-2004 à 14:32:25

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-12-2004 à 14:35:47    

benou a écrit :

c'est trop naze le coup du Class et newInstance !
passe lui son véhicule en paramètre du constructeur !


Mouaif ça me gène un peu quand même :/
C'est plus encapsulée à 100% ... tu vois ce que je veux dire.
 
Je trouvais ça pas mal, d'avoir une classe qui gère son paramétrage comme un grande, qui instancie ses attributs paramétrés, et s'autogère comme une grande ... mais bon, peut-être que je me goure ...

Reply

Marsh Posté le 21-12-2004 à 14:38:53    

EDIT : ne pas lire ce message :o
Et puis c'est pas du tout redondant :

Code :
  1. Personne<Voiture> p3=new Personne<Voiture>(new Voiture());


Message édité par bobuse le 21-12-2004 à 14:54:29
Reply

Marsh Posté le 21-12-2004 à 14:43:50    

pas plus qu'avec un Voiture.class [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-12-2004 à 14:46:36    

benou a écrit :

pas plus qu'avec un Voiture.class [:spamafote]


[:neowen]
 
bon en fait, on n'est pas obligé de mettre le deuxième <Voiture>, car il est déduit, même si eclipse met des beaux warnings en jaunes :o :

Code :
  1. Personne<Voiture> p3=new Personne(new Voiture());


Message édité par bobuse le 21-12-2004 à 14:52:41
Reply

Marsh Posté le 21-12-2004 à 16:03:45    

ha tiens, je savais pas ca ... :gratgrat:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-12-2004 à 00:12:10    

je suis le seul a trouver ca indigeste [:le kneu]

Reply

Marsh Posté le 22-12-2004 à 00:14:22    

c'est comme les endives, on y prend gout.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-01-2005 à 15:05:35    

veryfree a écrit :

je suis le seul a trouver ca indigeste [:le kneu]


franchement lis le tut de sun en entier : http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
 
et tu verras que c'est bougrement intéressant, et peut rendre une librairie beaucoup plus lisible !

Reply

Marsh Posté le 04-01-2005 à 13:35:51    

j'imprime ca merci ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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