2017-09-06 3 views
1

Je réécrite cette ligne de code:Comment obtenir l'objet Class à partir d'une liste paramétrée Liste pour l'entrée dans une nouvelle déclaration d'objet?

JsonResponse<LoginResult> response = new JsonResponse<>(LoginResult.class); 

à ceci:

JsonResponse<LoginResult[]> response = new JsonResponse<>(LoginResult[].class); 

Parce que je voulais passer le tableau de LoginResults.

Mais maintenant, je voudrais le réécrire en utilisant ArrayList et bien sûr je coincé dans ce:

JsonResponse<List<LoginResult>> response = new JsonResponse<List<LoginResult>>(List<LoginResult>.class); 

Je comprends que je ne peux pas l'objet de classe à partir du type paramétrisé. J'ai lu beaucoup de sujets comment faire cela mais je ne suis pas sûr comment réécrire le code dans ma situation, parce que j'ai besoin de l'objet de classe en tant qu'entrée pour le constructeur de JSonResponse?

public class JsonResponse<T> extends JsonRequest { 

    private Type type; 

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

    public Type getType() { 
     return type; 
    } 

    public void setType(Type type) { 
     this.type = type; 
    } 

    @SuppressWarnings("unchecked") 
    public T getResult() { 
     return (T) getAttribute(RESULT); 
    } 
} 

Pouvez-vous m'aider ou me donner quelques indices pour résoudre ce problème? Je vous remercie!

+0

Qu'est-ce que vous utilisez 'type' dans votre classe' JsonResponse'? Pour le moment, vous n'utilisez pas 'type', vous pouvez donc simplement l'enlever et votre problème disparaît. Et comment résoudre votre problème dépend de ce que vous faites avec 'type'. –

Répondre

2

Vous pouvez créer une classe wrapper pour cette liste, quelque chose comme:

public class LoginResultList { 

    private List<LoginResult> loginResultList; 

    // getters, setters etc... 

} 

Ou vous pourriez hériter de cette classe de conteneur de la même ArrayList:

public class LoginResultList extends ArrayList<LoginResult> {} 
+0

Merci pour votre aide! Cela fonctionne mais maintenant je voudrais savoir pourquoi Java n'est pas capable de me reconnaître ou de me renvoyer le type de liste paramétrée? Il est évident que le type stocké dans la liste est (sera) dans mon cas LoginResult, n'est ce pas? – vviston

+0

Lors de l'exécution, cette liste peut contenir n'importe quoi, car il n'y a aucune information sur les types paramétrés lors de l'exécution en raison de l'effacement du type. Vous ne pouvez donc pas référencer un type "Liste paramétrée avec LoginResult", car à l'exécution, il n'y a pas de type (sauf si vous le créez explicitement, comme dans mon exemple). Vous pouvez en savoir plus sur le type d'effacement ici, par exemple http://www.baeldung.com/java-type-erasure –

+0

Merci beaucoup! :) – vviston

1

Vous pouvez trouver les JsonResponse « s paramètre de type générique de toute sous-classe, y compris une sous-classe anonyme.

public class JsonResponse<T> { 

    private Type type; 

    public JsonResponse() { 
    Class<?> curClass = this.getClass(); 
    if (curClass == JsonResponse.class) { 
     // not a subclass with a type parameter, so assume the response 
     // is just an Object. 
     type = Object.class; 
    } 
    else { 
     // in case it's not a direct subclass, search upward for JsonResponse 
     while (curClass.getSuperclass() != JsonResponse.class) { 
     curClass = curClass.getSuperclass(); 
     } 

     // get the generic type information for JsonResponse 
     Type responseType = curClass.getGenericSuperclass(); 
     if (!(responseType instanceof ParameterizedType)) { 
     throw new IllegalStateException(
      "JsonResponse type definition should have been parameterized."); 
     } 
     Type[] responseTypeParams = 
      ((ParameterizedType) responseType).getActualTypeArguments(); 

     // get the only type parameter, <T> 
     type = responseTypeParams[0]; 
    } 
    } 

    public Type getType() { 
    return type; 
    } 
} 

Maintenant vous pouvez obtenir les informations de type générique, aussi longtemps que vous instancier en fait comme un type anonyme:

// instantiate as an anonymous subclass (the "{}") 
JsonResponse<?> response = new JsonResponse<List<String>>() {}; 
System.out.println(response.getType()); 
// outputs "java.util.List<java.lang.String>" 
+0

Merci pour vos conseils aussi! C'est une approche intéressante. – vviston