Bonjour,
Bien qu'ayant l� de la doc sur les G�n�rics et ayant constat� des manques par rapport aux templates C++, je me demande si il �tait tout de m�me possible d'avoir un �quivalent aux traits C++ ?
quelqu'un aurait-il une id�e ?
Merci
Version imprimable
Bonjour,
Bien qu'ayant l� de la doc sur les G�n�rics et ayant constat� des manques par rapport aux templates C++, je me demande si il �tait tout de m�me possible d'avoir un �quivalent aux traits C++ ?
quelqu'un aurait-il une id�e ?
Merci
Les traits servent principalement � d�finir une caract�risation sur un type et ce de fa�on statique. Ceci est rendu possible par la surcharge de template pour les diff�rents type qu'ils adressent. C'est en gros de la d�finition de fonction au m�ta-niveau
Imagine par exemple, que tu veuilles d�finir la caract�ristique de taille m�moire utilis�e pour des types. Tu vas d�finir un template qui retourne 2 pour un appel size_traits<short>::size, et 4 pour un appel size_traits<int>.
l� ca parra�t obscur comme fa�on de faire, mais c'est rendu n�cessaire si tu travaille dans le m�ta niveau. Si tu as un template qui accepte un type T dont tu veux connaitre la propri�t� de taille, tu peux appliquer le traits size_traits<T> dessus, donc introspecter sur un type anonyme.
En java, ca n'existe tout simplement pas. Il faut passer par des class<T>...
Je n'ai pas tout compris � tes traits... mais l'introspection d'une classe existe en java (par contre, je ne suis pas certain que celle-ci fonctionne sur une classe anonyme): si tu veux en savoir d'avantage sur l'introspection en java, regarde le package "java.lang.reflect"
Bonjour,
Si j'ai bien compris l'exemple fourni, il me semble que c'est le fonctionnement des interfaces :
Code:
1
2
3
4 public interface SizeTraits { public int size(); }
Code:
1
2
3
4
5
6 public class ShortSizeTraits implement SizeTraits { public int size() { return 2; } }
Et l'utilisation :Code:
1
2
3
4
5
6 public class IntSizeTraits implement SizeTraits { public int size() { return 4; } }
A+Code:
1
2
3
4 public void test(SizeTraits st) { System.out.println(st.size()); }
ton code sera utile au run-time, mais dans mon cas, cela ne m'int�resse pas, car il me faut un �l�ment utile au compile-time.
Les generics Java n'ont pas la m�me approche qu'en C++, et �a m'ennuie, car j'aurais bien voulu appliquer les "traits" c++ en Java.
J'ai du mal � t'aider parce que je ne comprends pas ces traits.
Pourrais-tu donner un autre exemple, parce que de toutes fa�ons la notion de taille m�moire n'existe pratiquement pas en java (m�me si, bien s�r, il y en a une).
Les m�ta-informations - dans une acceptation intuitive - sont souvent donn�es par des annotations, mais, � part un petit nombre standard, elles ne sont pas trait�es par le compilateur ; pour elles il faut se faire son propre compilateur d'annotations.
Les traits sont ce que l'introspection et les annotations permettent de faire en java, mais pas au m�me niveau. Les traits permettent de d�finir un m�ta op�rateur, s'appliquant sur un type et retournant un r�sultat. On peut ainsi d�finir un trait 'facette' qui retourne une description, ou une icone sur un objet m�tier devant poss�der un signifiant, ou un trait 'strategie' qui retourne un algorithme particulier selon le type transmis.
Mais attention, cela est STATIQUE. En c++ c'est � la compilation que s'interpr�tent les traits, en java c'est � l'ex�cution. C'est pas seulement par int�r�t que cela survient � la compilation en C++, c'est absolument n�cessaire quand on joue avec les templates, car on manipule des types anonymes (voir ce qu'en fait la biblioth�que boost).
Ces traits sont-ils d�finis dans le cadre d'une classe ou d'autre chose ?
En Java, � la compilation, on n'a pas grand chose d'autre que des classes, des interfaces, et des types g�n�riques.
Je tente une approche pour voir : si je fais une classe Facette, avec une m�thode getDescription(), est-ce que cela pourrait ressembler � un trait ?
Non pas du tout, car tu exprime un propri�t� d'instance, alors qu'en C++ c'est une propri�t� de type (de classe). On peut pas l'exprimer facilement en java � cause du type-erasure.
Cela dit, plus j'y r�fl�chis, et moins je vois d'int�r�t aux traits en java, car les templates n'y sont pas exprimable...
Pour moi les staits ne sont pas utiles en Java car en Java le type g�nerique ne peut s'exprimer que sur des object et non sur des types simple (int, double ...).
Par exemple:
Donc en fait on n'a pas le probl�me que m�langer des types du genre char et char*.Code:java.util.List<int> aList = ....//ne compile pas
Il est toujours possible d'utiliser les wilcards pour �tre sur que l'object herite d'une certaine interface.
Exemple:
Code:class toto<T extend MYCLASS>