Disons que les templates en gros le compilo il se fait pas trop chier : il compile la classe générique avec le type object. Et pour faire semblant d'avoir réussi son tour de passe passe, il fait pas dans le détail : il rajoute des cast partout. Voilà pour la solution Java. Avantage : ça marche sur les VM actuelles sans problème (et pour cause, c'est juste de la bidouille syntaxique à la compilation)
Pour ce qui est de l'implémentation du C#, le code est remplacé à l'éxécution par son vrai type. Ca change quoi ? Tout. Tout d'abord le code est partagé par toutes les instances de la classe "générique", et surtout, à l'exécution, une classe générique reste une classe générique et toutes les possibilités de Reflexions sont parfaitement gardées. Si l'on prend exemple sur un type liste générique, en Java tu pourras déterminer à l'exécution qu'une liste est une liste, mais pas plus, tu ne peux pas savoir que c'est une liste de int ou de bool. En C# tu peux récupérer le vrai type, créer une nouvelle instance avec un nouveau type à la volée, etc.
Pour plus de détails sur les différences entre les generics en Java, C++ et C#, c'est par ici : http://www.artima.com/intv/generics.html(...)
On y comprend clairement les limites des templates en C++ notamment.
Il est clair que l'avantage de la solution Sun et de ne pas avoir à modifier l'implémentation des VM pour faire fonctionner son code... Mais celà risque de rendre la VM Java vite obsolète face aux concurrents, les spécifications officielles de la VM de l'ECMA (celle de Mono et Microsoft) a déjà plus évolué en 2 ans que celle de Java depuis sa création...
[^] # Re: Mozilla souhaite s'allier à d'autres projet Libres pour faire face à MS-Longhorn
Posté par TImaniac (site web personnel) . En réponse à la dépêche Mozilla souhaite s'allier à d'autres projet Libres pour faire face à MS-Longhorn. Évalué à 2.
Pour ce qui est de l'implémentation du C#, le code est remplacé à l'éxécution par son vrai type. Ca change quoi ? Tout. Tout d'abord le code est partagé par toutes les instances de la classe "générique", et surtout, à l'exécution, une classe générique reste une classe générique et toutes les possibilités de Reflexions sont parfaitement gardées. Si l'on prend exemple sur un type liste générique, en Java tu pourras déterminer à l'exécution qu'une liste est une liste, mais pas plus, tu ne peux pas savoir que c'est une liste de int ou de bool. En C# tu peux récupérer le vrai type, créer une nouvelle instance avec un nouveau type à la volée, etc.
Pour plus de détails sur les différences entre les generics en Java, C++ et C#, c'est par ici :
http://www.artima.com/intv/generics.html(...)
On y comprend clairement les limites des templates en C++ notamment.
Il est clair que l'avantage de la solution Sun et de ne pas avoir à modifier l'implémentation des VM pour faire fonctionner son code... Mais celà risque de rendre la VM Java vite obsolète face aux concurrents, les spécifications officielles de la VM de l'ECMA (celle de Mono et Microsoft) a déjà plus évolué en 2 ans que celle de Java depuis sa création...