|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2006 Messages : 61 ![]() |
Bonjour a tous,
je cherche à créer une structuration de class manipulant des objets qui peuvent être des doubles ou des complexes. Afin de ne pas écrire plusieurs fois les class Point2D, Point3D, vector, matrix... qui manipule soit des doubles soit des complexes j’aimerai utiliser les generics. J'ai donc créé des class (Point2D, Point3D, vector, matrix...) manipulant des : MyNumber<> MyDouble et MyComplex sont des MyNumber<> Or j'ai un problème à la compilation comme définie en suivant: Code :
- MyDouble est de type "MyNumber<MyDouble>" - le type "Type" dans la class Triedre est de type "MyNumber<Type>" comment faire en sorte que les types soit compatible? Merci d'avance pour votre support. Sébastien. |
||
|
|
00
|
|
|
#2 | ||||||||
![]() ![]() |
Une double est un double, il n'a pas besoin de paramètre et ne peut donc pas avoir de paramètre. MyDouble doit être de type MyDouble sans paramètre.
De même MyComplex ne doit pas avoir de paramètre. Les deux doivent répondre à une interface commune pour addition, etc. Donc interface MyNumber, implémentée par les deux. Mais il va lui falloir un paramètre. Parce que, pour l'addition, supposons que ça ressemble à ça : Code :
Code :
Comme ça : Code :
Pour les rendre comparables, ajouter : Code :
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais. Partagez vos connaissances, mais aussi comment s'en servir. |
||||||||
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2006 Messages : 61 ![]() |
Bonsoir thelvin,
Je suis d'accord avec toi et je pense que ce que j'ai posté dans mon premier message répond à se que tu dis. Toutefois, j'ai un problème lorsque je veux utiliser MyDouble et MyComplex dans une class utilisant le père de ses deux class (MyNumber<T>). Soit le type "Type" qui extends "MyNumber<Type>" pourquoi n'est il pas possible de faire ce qui suit? Type a = new MyDouble(); Or MyDouble est bien du type MyNumber<T> |
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 655 ![]() |
Salut,
Citation:
Ensuite non ce n'est pas la même chose, justement parce que le type exact des paramètres paramétrés n'est pas connu lors de la compilation de ta classe. Lorsque tu compiles ceci : Code :
class Triedre<T extends MyNumber<T>> { En effet lorsque tu associes un objet de type "MyDouble" dans un objet de type T, tu casses la généricité. En effet cela marchera lorsque tu utiliseras un new Triedre<MyDouble>, mais que se passera-t-il lorsque tu instancieras un new Triedre<MyComplex> ? En effet T devrait correspondre alors à MyComplex, mais tu met un MyDouble dedans ce qui est impossible puisqu'il s'agit d'un type parent. C'est comme si tu écrivais ceci : Bref lorsque tu écris une classe générique, le type précis est inconnu et tu ne peux pas présumer qu'il s'agira d'un type précis. Sinon les generics sont inutiles... a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
|
00
|
|
|
#5 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2006 Messages : 61 ![]() |
Bonjour AdiGuda,
Merci pour ta réponse. Elle confirme mes dernières recherches sur les génériques. De ce fait, j'ai revu mon code hier soir. J'ai ajouté un constructeur à ma class abstract MyNumber prenant un "double" qui sera implémenté dans le class irritant de MyNumber: Code :
Code :
PS: Merci pour le rappel des conventions de nommage des generics. Si j'ai utiliser <Type> au le de <T> c’était pour vérifier qu'il n'y avait pas de confusion entre les différents type generic. |
||||
|
|
00
|
|
|
#6 | ||||||||
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 655 ![]() |
Citation:
Citation:
En fait tu veux faire ceci : Mais c'est quoi T ? Cela peut être un MyDouble, un MyComplex... ou n'importe quelles autres classes héritant de MyNumber ! Le compilateur ne peut pas décider de cela à ta place ! Dis-toi bien qu'à l'intérieur du code d'une classe Generics, le type exact de T est inconnu. Donc le compilateur ne peut pas effectuer certaines opération comme new T() ou T.class... (enfin en vrai il pourrait le faire, mais cela aboutirait à du code non-typesafe, ce qui va à l'encontre même des Generics) Bref tu ne peux pas faire cela ! Soit tu fait quelque chose de fortement typé : Code :
Code :
A la rigueur, tu peux te faire deux petite méthode factory pour simplifier la création de Triedre<MyDouble> ou Triedre<MyComplex> : Code :
a++ PS : Tant que tu n'encapsules pas les classes il n'y a aucun conflit dans les noms des paramètres Generics. C'est au contraire le fait d'utiliser un nom de classe qui apporte de la confusion dans la lecture du code...
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||||
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2006 Messages : 61 ![]() |
j'aurai une petite nuance à ta réponse. Mais peut être que j'ai mal compris un truc.
Je suis Ok sur le fait que "Type" n'est pas spécifiquement connu par la compilateur. Mais le compilateur sait qu'il extends MyNumber non? or si on déclare un constructeur dans MyNumber il doit pouvoir le voir non? |
|
|
00
|
|
|
#8 | |
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 655 ![]() |
Oui, et c'est tout ce qu'il sait.
Du coup tu peux utiliser les méthodes définis dans MyNumber sur les objets de type T. Citation:
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2006 Messages : 61 ![]() |
Oui effectivement j’oublie toujours ce fait.
Merci pour tes conseils. Je constate que tu est toujours aussi magnanime malgré les années. Bonne continuation. Sébastien. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com