Java: instanceof Generic
N'y a-t-il aucun moyen de trouver le type de classe d'un générique?
if (T instanceof String) {
// do something...
}
ci-dessus n'a absolument pas compiler.
4 réponses
les Génériques sont un moment de la compilation de la fonctionnalité. Les génériques ajoutent des vérifications au moment de la compilation qui peuvent ne pas avoir de sens à l'exécution. C'est un exemple. Vous ne pouvez vérifier le type de l'objet référencé, qui pourrait être un super-type dans le 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 ne peut pas être le même,
someMethod(Number.class, 1);
si vous avez sous-classe
public class SomeClass extends SomeSubclass<String>{}
et
public class SomeSubclass<T> {}
alors il y a une façon 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 coup d'oeil à org.ormunit.entité.AEntityAccessor#extractClass
il ne compilera pas parce que T n'est pas une variable, mais un support de place pour une classe qui est définie à 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 un champ spécifique, vous pouvez le vérifier comme ci-dessous:
private <T> String someMethod(T genericElement)
{
if (String.class.isInstance(genericElement))
{
return (String) genericElement;
}
...