2016-04-08 3 views
0

Ich übergebe eine TypeToken an eine Methode. Der Code unten funktioniert, aber ich habe Angst, dass, indem ich Object list als etwas spezifischer nicht explizit definiere, spukt mich später, aber ich kann einen Weg nicht finden, es als zu definieren oder zu werfen, ohne einen Compiler-Fehler oder eine Warnung zu erhalten. Ich scheint, wie es sollte ein Weg sein, so etwas wie (listTypeToken.getType()) list = ...Wie führe ich Casting mit TypeTokens in Java durch?

hier zu tun ist, ist der Code Definition der TypeToken:

TypeToken<List<ServerInfo>> listTypeToken = new TypeToken<List<ServerInfo>>(){}; 

Hier ist der Code, wo ich die TypeToken verwende. Ich denke, Object list sollte als etwas konkreter gegossen werden.

public static <T> void processJson(GsonBuilder gsonBuilder, 
            String jsonString, 
            String action, 
            TypeToken<T> listTypeToken) 
{ 
    //Trimmed from brevity 
    Object list = gson.fromJson(jobject.get(action).getAsJsonArray(), 
           listTypeToken.getType()); 
} 

ist hier eine der anderen erfolgreichen Ansätze, aber ich bin nicht sicher, ob es der entsprechende Kurs:

@SuppressWarning("rawtypes") 
List list = gson.fromJson(jobject.get(action).getAsJsonArray(), 
           listTypeToken.getType()); 
+0

machen Sie es Liste list = gson.fromJson (jobject.get kann nicht (action) .getAsJsonArray(), listTypeToken.getType()); ? – Sampada

+0

Die ServerInfo ist nur eine der etwa 50 Klassen, die übergeben werden könnten. Es war eigentlich diese Art von statischer Codierung, mit der ich mit der TokenType-Codierung umgehen wollte, um den Prozess auf eine Methode zu übertragen. – lumberajackshaw

Antwort

1

fromJson gibt ein T so den richtigen Weg, dies wäre:

T list = gson.fromJson(jobject.get(action).getAsJsonArray(), 
           listTypeToken.getType()); 

Wenn Sie sicher sind, dass T immer ein Subtyp von List ist, müssen Sie eine Einschränkung in der Deklaration angeben ation des Verfahrens:

public static <T extends List<?>> void processJson(...) 

Oder vielleicht das, was Sie mit den Elementen des List arbeiten lässt:

public static <E, T extends List<E>> void processJson(...) 
Verwandte Themen