Considérez cette extension de hashmap (génère une instance de la classe V lorsque vous appelez «Obtenir» si c'est NULL)
Map<String,Section> sections = new HashMapSafe<String>(Section.class);
5 Réponses :
n'est pas possible. Le premier nécessiterait de pouvoir faire quelque chose comme nouveau V () code> et que cela ne peut pas être fait. La seconde nécessiterait de pouvoir définir le type V code> au moment de l'exécution, car il est passé dans le constructeur, qui ne peut pas être effectué. Gardez à l'esprit que les génériques ne sont utilisés que d'un temps de compilation et ils sont effacés pour l'exécution. P>
Y a-t-il un moyen d'éviter le constructeur qui passe la classe? p>
En bref, non. P>
La cause de la racine est "Effacement de type". Au moment de l'exécution, la mise en œuvre de HASHMAPSafe n'a aucune connaissance implicite des types correspondant aux paramètres de type. Cette information est effacée em>. Si vous avez besoin de la mise en œuvre pour savoir quel est le type, vous devez le transmettre sous forme d'objet
Classe CODE> compatible avecClassecode>. P> Map<String,Section> sections = new HashMapSafe<String>(Section.class);
Non, il n'y a pas. Java n'a pas génériques réifiés .
GUAVA a cependant une belle solution en saveur de qui définit et renvoie mapmaker # makecomputingmap () code> p> 0 code> au lieu de null code> lorsque la clé n'est pas présente (et elle est threadsafe, par opposition à votre solution). P> p>
C'est une classe de collection plutôt belle :) Je peux imaginer que cela soit très utile en tant que cache sans effort normal.
Vous ne pouvez pas améliorer l'utilisation du constructeur en raison de l'effacement de type, car d'autres ont déjà souligné, mais vous devriez être capable d'améliorer la verbosité en utilisant une méthode d'usine statique au lieu d'un constructeur ...
Je ne suis pas devant compilateur et je ne peux jamais obtenir de paramètres de type de méthode tout au premier essai, mais cela ira quelque chose comme ça ... p>
J'ai trouvé cet article intéressant: Réfléchir des génériques
Court utilisant: p>
Notez que cela ne fonctionne que lorsque vous déclarez un type générique fixe directement dans la classe comme Classe MyMap étend MyAbstractMap
Vous pouvez garder la classe générique que vous venez de vous déclarer class comme celui-ci nouveau hashmapsafafe {} code> vous pouvez faire la classe résumé pour éviter de retarder de faire cela.
Ainsi, une recherche sur Google de 'Java NewInstance Generic Class' a révélé plusieurs anciens messages impliquant cela.getClass () suivi d'une capacité d'accéder aux génériques de l'objet et d'obtenir donc la classe de ces génériques, suggérant que votre première option est possible. Voir: Stackoverflow .com / questions / 75175 / ...