42 votes

Java : instancede 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...
}

Ce qui précède n'est absolument pas compilé.

55voto

Peter Lawrey Points 229686

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

5voto

drekka Points 10020

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

}

3voto

Tomasz Krzyżak Points 914

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

2voto

Adir D Points 480

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;
    }
...

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