97 votes

Génériques Java - Vous avez cours?

J'ai une liste, programmée comme ceci: public class MyList<T> . Existe-t-il un moyen d'utiliser la variable T pour obtenir le nom de la classe (afin que je puisse, à l'intérieur de MyList , savoir si T est String, Socket, etc.)?

EDIT: Nevermind, a trouvé la réponse ici .

136voto

duffymo Points 188155

Réponse courte : vous ne pouvez pas.

Réponse longue :

En raison de la manière dont les génériques sont implémentés en Java, le type générique T n'est pas conservé au moment de l'exécution. Néanmoins, vous pouvez utiliser un membre de données privé:

 public class Foo<T> 
{
    private Class<T> type;

    public Foo(Class<T> type) { this.type = type; } 
}
 

71voto

wutzebaer Points 1968

j'aime la solution de

http://www.nautsch.net/2008/10/28/class-von-type-parameter-java-generics/

 public class Dada<T> {

    private Class<T> typeOfT;

    @SuppressWarnings("unchecked")
    public Dada() {
        this.typeOfT = (Class<T>)
                ((ParameterizedType)getClass()
                .getGenericSuperclass())
                .getActualTypeArguments()[0];
    }
...
 

27voto

Andrew White Points 23508

Vous voyez le résultat de Type Erasure. À partir de cette page...

Quand un type générique est instancié, le compilateur traduit ces types de une technique dite de type erasure - un processus où le compilateur supprime tous les information relative aux paramètres de type et les arguments de type à l'intérieur d'une classe ou d' la méthode. Type d'effacement permet de Java les applications qui utilisent des médicaments génériques à maintenir la compatibilité binaire avec Les bibliothèques Java et applications ont été créés avant les génériques.

Par exemple, la Boîte de<String> est traduit de type Boîte, qui est appelé la crue de type d'une crue type est un classe générique ou nom de l'interface sans n'importe quel type d'arguments. Cela signifie que vous ne pouvez pas trouver le type de Un objet d'une classe générique est à l'aide à moment de l'exécution.

Cela ressemble également à cette question qui a une assez bonne réponse ainsi.

4voto

esaj Points 8338

Je ne suis pas sûr à 100% si cela fonctionne dans tous les cas (nécessite au moins Java 1.5):

 import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class Main 
{
    public class A
    {   
    }

    public class B extends A
    {       
    }


    public Map<A, B> map = new HashMap<Main.A, Main.B>();

    public static void main(String[] args) 
    {

        try
        {
            Field field = Main.class.getField("map");           
            System.out.println("Field " + field.getName() + " is of type " + field.getType().getSimpleName());

            Type genericType = field.getGenericType();

            if(genericType instanceof ParameterizedType)
            {
                ParameterizedType type = (ParameterizedType) genericType;               
                Type[] typeArguments = type.getActualTypeArguments();

                for(Type typeArgument : typeArguments) 
                {   
                    Class<?> classType = ((Class<?>)typeArgument);                  
                    System.out.println("Field " + field.getName() + " has a parameterized type of " + classType.getSimpleName());
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }    
}
 

Cela produira:

La carte de terrain est de type Carte
La carte de terrain a un type paramétré de A
La carte de terrain a un type paramétré de B

3voto

Peter Tseng Points 3272

Je suis en mesure d'obtenir la Classe de type générique, de cette façon:

class MyList<T> {
  Class<T> clazz = (Class<T>) DAOUtil.getTypeArguments(MyList.class, this.getClass()).get(0);
}

Vous avez besoin de deux fonctions à partir de ce fichier: http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil.java

Pour plus d'explication: http://www.artima.com/weblogs/viewpost.jsp?thread=208860

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