web-dev-qa-db-fra.com

Java: instance de générique

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 ne compile certainement pas.

30
someguy

Les génériques sont une fonctionnalité de compilation. Les génériques ajoutent des contrôles au moment de la compilation, ce qui peut n'avoir aucune signification au moment de l'exécution. Ceci est un exemple. Vous pouvez uniquement 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 peut ne pas être le même,

someMethod(Number.class, 1);
43
Peter Lawrey

si vous avez une sous-classe 

public class SomeClass extends SomeSubclass<String>{}

et

public class SomeSubclass<T> {}

alors il y a un moyen de découvrir le type de T en exécutant du 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

4
Tomasz Krzyżak

Il ne compilera pas car T n'est pas une variable, mais un espace réservé pour une classe définie au moment de l'exécution. Voici un échantillon 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
drekka

Si vous avez un champ spécifique, vous pouvez simplement le vérifier comme ci-dessous:

private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...
1
Adir