2010-07-06 8 views
2

La ma question est la suivante:instance de type générique

Pourquoi ne peut instancier un type générique avec le nouveau T() et au lieu de newInstance() de la classe de classe que vous pouvez faire?

+0

En relation avec: http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java, http://stackoverflow.com/questions/731452/create-instance-of- générique-type –

+1

Et si T n'a pas de constructeur approprié? –

Répondre

7

Vous devez utiliser la réflexion (newInstance()), car au moment de la compilation, la classe dont le constructeur aurait besoin d'être lié est inconnue. Le compilateur ne peut donc pas générer le lien.

7

En raison de type d'effacement: le type générique ne sait pas à l'exécution ce que est T, donc il ne peut pas appeler le bon constructeur. Pour plus d'informations, voir Angelika Langer's FAQ entry on type erasure.

1

Peut-être, vous cherchez à ce modèle (pris d'une réponse à une autre question):

private static class SomeContainer<E> 
{ 
    E createContents(Class<E> clazz) 
    { 
     return clazz.newInstance(); 
    } 
} 

Ici, lorsque nous créons un SomeContainer, nous parametize l'instance d'une classe concrète (comme String) . createContents acceptera String.class uniquement et String.class.newInstance() va créer une nouvelle chaîne (vide).

0

Si vous connaissez le type lors de la compilation, utilisez "new Whatever()". Si vous ne connaissez pas le type au moment de la compilation mais que vous pouvez obtenir un objet Class pour cela, utilisez newInstance().

99% du temps je connais le type et j'utilise "new Whatever()".

Questions connexes