constructeur d'un type générique [Résolu : pas possible] - Java - Programmation
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
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 ...
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 ... |
c'est un peu concon, non ?
pourrait pas lever une exception au runtime ? Voir meme a la compilation verifier si le code est valide ?
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 : |
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
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 |
habitude du c++....
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
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 : |
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.
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
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.
Marsh Posté le 20-12-2004 à 15:15:15
chrisbk a écrit : |
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
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 ? 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 |
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.
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 ? 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 : |
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 ??
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 ? 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
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
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 ...
Marsh Posté le 20-12-2004 à 15:39:35
non rien
Marsh Posté le 20-12-2004 à 15:39:55
chrisbk a écrit : tu reponds a qui la ? |
edited
t'as posté trop vite
edit : trop tard
Marsh Posté le 20-12-2004 à 15:42:56
chrisbk a écrit : pareil pour toi |
ouais mais moi je t'ai ta tête
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
Marsh Posté le 21-12-2004 à 11:11:49
c'est plutot la faq d'angelika
Elle dis exactement la même chose que moi ... tu crois plus angelika que moi
Marsh Posté le 21-12-2004 à 14:18:06
benou a écrit : c'est plutot la faq d'angelika |
oups 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 : |
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
Marsh Posté le 21-12-2004 à 14:27:58
Voilà ce que ça donne
Mais c'est clair que c'est magouillé
Code :
|
Reste plus qu'à traiter les exception
Et mon main bidon devient :
Code :
|
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 !
Marsh Posté le 21-12-2004 à 14:35:47
benou a écrit : c'est trop naze le coup du Class et newInstance ! |
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 ...
Marsh Posté le 21-12-2004 à 14:38:53
EDIT : ne pas lire ce message
Et puis c'est pas du tout redondant :
Code :
|
Marsh Posté le 21-12-2004 à 14:43:50
ReplyMarsh Posté le 21-12-2004 à 14:46:36
benou a écrit : pas plus qu'avec un Voiture.class |
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 :
Code :
|
Marsh Posté le 21-12-2004 à 16:03:45
ReplyMarsh Posté le 22-12-2004 à 00:14:22
c'est comme les endives, on y prend gout.
Marsh Posté le 03-01-2005 à 15:05:35
veryfree a écrit : je suis le seul a trouver ca indigeste |
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 !
Marsh Posté le 20-12-2004 à 14:36:58
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 :
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 !
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