2010-05-24 2 views
2

Je suis de plus en plus frustré par les limites des génériques Java effacés. Je me demandais s'il y avait un compilateur Java personnalisé qui fournissait une version complète des génériques sans les bizarreries associées à l'effacement de type?Existe-t-il une extension générique non-effacée pour le compilateur Java disponible en tant qu'extension de compilateur tierce?

Chris

+7

Comment une telle chose pourrait-elle être implémentée en tant que * bibliothèque *? Je ne vois pas comment vous pourriez éviter de modifier le compilateur et la machine virtuelle. – sepp2k

+0

Post ce que vous aimeriez faire et ce que vous avez fait jusqu'à présent et peut-être que nous pourrions aider plus loin. Il est possible de contourner l'effacement de type dans la plupart des cas. – rmarimon

Répondre

5

Il est non seulement un changement de compilateur qui serait nécessaire. Je pense qu'il serait également nécessaire de modifier l'implémentation JVM d'une manière incompatible avec les spécifications JVM et les bibliothèques de classes Java d'une manière incompatible avec les API actuelles.

Par exemple, la sémantique de l'instruction checkcast change de manière significative, tout comme les objets renvoyés par l'opération Object.getClass(). En résumé, le résultat final ne serait plus "Java" et ne présenterait que peu d'intérêt pour la grande majorité des développeurs Java. Et tout code développé en utilisant les nouveaux outils/JVM/bibliothèques serait entaché. Maintenant, si Sun/Oracle proposait/effectuait ce changement ... , serait intéressant.

0

La question n'a pas de sens, sauf si vous affirmez que le compilateur JDK n'implémente pas le langage correctement. Tout compilateur qui n'obéirait pas aux mêmes règles ne serait pas un compilateur Java, personne ne pourrait en recommander l'usage.

1

Scala (une langue qui fonctionne sur le dessus de la machine virtuelle Java) peut vous permettre de contourner le problème de l'effacement de type en utilisant le concept puissant de manifests, qui essentiellement vous donner reified types.

Plus d'info: http://www.scala-blogs.org/2008/10/manifests-reified-types.html

+0

Citant du blog. "Le support de Scala pour les paramètres implicites, et l'injection automatique de Manifests par le compilateur, rend les types de réification sur la JVM * légèrement moins douloureux *." (mon accent) –

0

Ce serait faisable, mais je ne suis pas au courant de quelqu'un qui est encore fait. Cela nécessiterait une réécriture significative de javac pour lui faire instancier des génériques en cas de besoin (en créant un nouveau fichier .class pour chaque instanciation), mais autrement devrait être raisonnablement simple. Il pourrait même ajouter un support pour l'utilisation de types primitifs comme arguments de type génériques.