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.

29
demandé sur someguy 2011-01-16 13:47:14

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);
42
répondu Peter Lawrey 2011-01-16 10:58:53

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

4
répondu Tomasz Krzyżak 2014-02-13 07:38:44

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");
}

}
3
répondu drekka 2011-01-16 11:05:05

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;
    }
...
0
répondu Adir 2017-11-07 19:46:07