2010-09-09 7 views
3

Aujourd'hui, je rédigeais un peu lourd de code utilisant la réflexion, et je suis tombé sur ce comportement, je ne peux pas expliquer: pourquoiPourquoi la conversion d'un type [] en classe [] lance une exception ClassCastException?

Type[] types = ((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments(); 
Class[] c = (Class[])types; 

Jeter un ClassCastException, lorsque vous parcourez ce même tableau et coulée chaque élément, à savoir

for(Type t : types) { 
    Class c = (Class)t; 
} 

réussit? Je veux dire que si le moulage d'un seul élément dans une autre classe est possible, pourquoi la coulée entre des matrices de même type n'est-elle pas également possible?

Il y a une raison, mais je ne peux pas sembler probablement trouver un ...

+2

Peut-être que cela aide: http://stackoverflow.com/q/395030/61855 – theomega

Répondre

5

Vous ne pouvez pas jeter un Type[] à un Class[] parce qu'un Type[] n'est pas un Class[]. Cela peut sembler trivial, mais c'est tout ce qu'il y a à faire.

Si vous pouviez jeter un Type[] à un Class[], qu'est-ce que vous attendez de se produire lorsque l'un de ses éléments est un Type qui n'est pas Class (un ParameterizedType par exemple)?

+0

Je comprends, mais alors ClassCastException ne devrait-il pas être lancé seulement si l'un des éléments n'est pas une classe au lieu d'être lancé à chaque fois? – Raibaz

+0

Non, car le type d'exécution réel n'est pas un 'Class []', tout comme une instance de 'Object' (créé avec' new Object() ') ne peut pas être transformé magiquement en' String'. Voir ma réponse ci-dessous – thecoop

1

Gardez à l'esprit que pour lancer un Class[], l'objet doit être un Class[], pas un Type[]. À titre d'exemple, cela échouera:

Object[] objArr = new Object[10]; 
Integer[] intArr = (Integer[])objArr; // fail. 

mais cela fonctionnera:

Object[] objArr = new Integer[10]; 
Integer[] intArr = (Integer[])objArr; 
0

Vous ne pouvez pas lancer tableau entier, parce qu'il n'y a aucune garantie que tous les éléments du tableau sont de type Class. Que faire si l'un d'eux était une autre mise en œuvre de Type?