2015-09-14 1 views
0

Est-il possible d'obtenir quelque chose de semblable à Class<List<Data>>.class? J'ai lu que vous ne pouvez pas appeler .class en raison de la façon dont cela fonctionne interanlly, donc je me demandais si peut-être en utilisant quelque chose de similaire à new ArrayList<Data>().getClass() pourrait fonctionner? Celui en particulier ne fonctionne pas comme la classe retournée est Class<? extends List<Data>> alors je suis à court d'options, est-ce même possible?Obtenez un Class <T> ou un Type

Contexte: Je suis en train d'analyser un List<Data> en utilisant square/moshi mais la bibliothèque semble être sur alpha donc il n'y a aucune documentation.

+1

Generics utiliser [Type Erasure] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html). Ce qui signifie essentiellement qu'au moment où votre code est compilé, toutes les informations génériques ont disparu, et elles ne sont plus disponibles au moment de l'exécution. Ainsi, il n'y a pas de différence réelle entre une liste et une liste en ce qui concerne l'accès à l'exécution (par exemple la réflexion). –

+0

Il semble qu'il existe une méthode qui accepte un 'Type' comme paramètre pour créer un adaptateur. Vous pourriez vouloir le fournir, de la même manière que vous pouvez obtenir un type avec le tour 'TypeToken' de Gson. Voir aussi http://stackoverflow.com/questions/30005110/how-does-gson-typetoken-work –

Répondre

2

Il n'y a pas d'objet Class qui représente List<Data> car les types génériques sont uniquement une fonctionnalité de compilation. Il est possible de faire une variable de type Class<List<Data>> statique en faisant

Class<List<Data>> clazz = (Class<List<Data>>) (Object) List.class; 

Vous obtenez un avertissement du compilateur ici. Vraiment clazz est juste List.class et l'avertissement du compilateur est un indice que ce que vous faites n'est pas une bonne idée.

Il n'y a pas d'objet Class représentant List<Data> mais un objet Type.

Essayez ceci:

public class Main { 

    List<String> list; 

    public static void main(String[] args) throws Exception { 
     // prints java.util.List<java.lang.String> 
     System.out.println(Main.class.getField("list").getGenericType()); 
    } 
} 
+0

Et si au lieu de 'List ' c'était 'Liste '? Je dois passer un objet 'Type' à une bibliothèque d'analyseurs json, et ce type devrait être' List ', de sorte que la bibliothèque sache qu'elle devrait remplacer' T' pour 'Data'. Cela pourrait-il fonctionner? –

+0

Je viens de l'essayer et il a dit 'java.util.List '. Pour être honnête, je me rapproche dangereusement de l'étendue de mes connaissances sur ce sujet. Je suis d'accord avec Alexis C que vous devriez regarder dans 'TypeToken'. –