5 votes

Casting de types génériques sans avertissement ?

J'ai une longue histoire.

java generics bounds type

déclaration de type générique pour la réflexion

Quoi qu'il en soit, j'ai une méthode qui invoque une méthode en utilisant la réflexion et renvoie un résultat générique.

public static <V> JAXBElement<V> unmarshal(..., Class<V> valueType);

Le problème ( ?) est que lorsque j'obtiens le résultat de l'invocation de la méthode. Je dois le convertir.

final Object result = method.invoke(...);

J'ai découvert que je peux lancer le result sur JAXBElement<V> comme ça.

@SuppressWarnings("unchecked")
final JAXBElement<V> result = (JAXBElement<V>) method.invoke(...);
return result;

Y a-t-il un autre moyen de faire cela ? Je veux dire que j'ai obtenu le Class<V> valueType à utiliser.

Si non, est-ce que la déclaration suivante est un peu cumbersome ?

// no warning, huh? :)
final JAXBElement<?> result = (JAXBElement<?>) method.invoke(...);
return new JAXBElement<V>(result.getName(), valueType, result.getScope(),
                          valueType.cast(result.getValue()));

Merci.

2voto

NKukhar Points 1377

Non, method.invoke(...) n'est pas une méthode générique même entière Method n'est pas générique. Elle renvoie donc Object comme résultat et vous devez lancer.

// no warning, huh? :)
final JAXBElement<?> result = ...

Oui, pas d'avertissement mais JAXBElement<?> met certaines restrictions, par exemple vous ne pouvez pas mettre de valeurs dans cette structure de données. Vous pouvez simplement obtenir Objects à partir de là, donc vous aurez probablement besoin de le canter plus tard dans votre code...

1voto

tbodt Points 6671

Vous devez déclarer le type générique V dans votre méthode comme ceci :

public <V> JAXBElement<V> unmarshal(..., Class<V> valueType)

En dehors de cela, je ne trouve aucune erreur dans votre code.

1voto

lpiepiora Points 5207

En général, la réponse courte est non.

Cependant, si vous y réfléchissez, que voulez-vous réaliser ? Vous avez dit que vous vouliez invoquer un morceau de code par réflexion. Les génériques sont utilisés pour prouver que votre code est correct au moment de la compilation (ils sont donc effacé au moment de la compilation, et en général non disponible au moment de l'exécution).

Si vous appelez une méthode par réflexion, vous pouvez littéralement l'appeler avec n'importe quel type et obtenir n'importe quel type en résultat. Il serait très difficile de prouver l'exactitude de la méthode au moment de la compilation.

Vous pourriez peut-être modifier votre code pour qu'il n'utilise pas la réflexion, et ainsi éviter le casting.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X