N'y a-t-il aucun moyen de trouver le type de classe d'un générique ?
if (T instanceof String) {
// do something...
}
Ce qui précède n'est absolument pas compilé.
N'y a-t-il aucun moyen de trouver le type de classe d'un générique ?
if (T instanceof String) {
// do something...
}
Ce qui précède n'est absolument pas compilé.
Les génériques sont une fonction de compilation du temps. Les génériques ajoutent des vérifications au moment de la compilation qui peuvent ne pas avoir de signification au moment de l'exécution. C'est un exemple. Vous ne pouvez vérifier que le type de l'objet référencé qui pourrait être un super type de code. Si vous voulez passer le type T, vous devez le faire explicitement.
void someMethod(Class<T> tClass) {
if(String.class.isAssignableFrom(tClass))
ou
void someMethod(Class<T> tClass, T tArg) {
Remarque : le type peut ne pas être le même,
someMethod(Number.class, 1);
Il ne compilera pas parce que T n'est pas une variable, mais un substituant pour une classe qui est définie au moment de l'exécution. Voici un exemple rapide :
public class Test<T> {
public void something(T arg) {
if (arg instanceof String) {
System.out.println("Woot!");
}
}
public static void main(String[] args) {
Test<String> t = new Test<String>();
t.something("Hello");
}
}
si vous avez une sous-classe
public class SomeClass extends SomeSubclass<String>{}
et
public class SomeSubclass<T> {}
ensuite, il y a un moyen de découvrir le type de T en exécutant le code
Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
// in simple cases actualTypeArguments will contain Classes, since Class implements Type
}
si votre cas est un peu plus complexe (? extends String
)` jetez un oeil à org.ormunit.entity.AEntityAccessor#extractClass
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.