6
votes

Y a-t-il un moyen d'éviter le constructeur qui passe la classe?

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);


1 commentaires

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 / ...


5 Réponses :


1
votes

n'est pas possible. Le premier nécessiterait de pouvoir faire quelque chose comme nouveau V () et que cela ne peut pas être fait. La seconde nécessiterait de pouvoir définir le type V 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.


0 commentaires

0
votes

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 avec Classe code>. P>

Map<String,Section> sections = new HashMapSafe<String>(Section.class);


0 commentaires

3
votes

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 mapmaker # makecomputingmap () xxx

qui définit et renvoie 0 au lieu de null lorsque la clé n'est pas présente (et elle est threadsafe, par opposition à votre solution).


1 commentaires

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.



6
votes

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 ... xxx


0 commentaires

1
votes

J'ai trouvé cet article intéressant: Réfléchir des génériques

Court utilisant: xxx


2 commentaires

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 . J'imagine que l'OP aimerait garder sa classe générique.


Vous pouvez garder la classe générique que vous venez de vous déclarer class comme celui-ci nouveau hashmapsafafe () {} Note du supplément {} vous pouvez faire la classe résumé pour éviter de retarder de faire cela.