2016-04-06 11 views
1

Ich versuche, ein JSON-Array zu erhalten, deserliaze, wenn die Verwendung von Generika, siehe meine Arbeit unter:Gson fromJson generische Superklasse mit

public class Lookup<T extends Profile> { 

    protected final Class<T> getSuperClass() { 
     ParameterizedType superClass = (ParameterizedType)this.getClass().getGenericSuperclass(); 
     return (Class<T>)(superClass.getActualTypeArguments().length == 0 ? BasicProfile.class : superClass.getActualTypeArguments()[0]); 
    } 

    protected final Class<T[]> getSuperClassArray() { 
     ParameterizedType superClass = (ParameterizedType)this.getClass().getGenericSuperclass(); 
     return (Class<T[]>)(superClass.getActualTypeArguments().length == 0 ? BasicMojangProfile[].class : superClass.getActualTypeArguments()); 
    } 

    public void doWork() { // This Works 
     String jsonText = "{id=3, name=Derp}"; 
     T result = new Gson().fromJson(jsonText, this.getSuperClass()); 
     // Will be whatever T is (defined elsewhere), unless this class 
     // is created without a super class then properly defaults to 
     // the BasicProfile 
    } 

    public void doArrayWork() { // DOES NOT WORK 
     String jsonText = "[{id=3, name=Derp}]"; 
     T[] result = new Gson().fromJson(jsonText, ?); 
     // Have tried the following (in place of the ?): 
     // new TypeToken<T>(){}.getType() 
     // new TypeToken<T[]>(){}.getType() 
     // new TypeToken<List<T>>(){}.getType() // with List<T> result 
     // this.getSuperClassArray() 
    } 

} 

Wie kann ich doArrayWork bekommen richtig funktionieren? Ich möchte nicht das, was T ist, als Parameter für die Methode übergeben.

Antwort

2

Sie können Array.newInstance(this.getSuperClass(), 0).getClass() verwenden.

Dies erstellt ein Array basierend auf der an die Methode übergebenen Klasse, dann ruft es getCLass() für dieses Array auf, um das reale Klassenobjekt zu erhalten, das dieses Array darstellt.

+1

Ich kann nicht glauben, wie unglaublich einfach die Lösung war ... tyvm –

Verwandte Themen