Erstellen Sie TypeToken für das Argument type des generischen Supertyps

9

Ich implementiere ein Gson TypeAdapter für zwei abhängige generische Modelle.

%Vor%

Dafür muss ich die TypeToken und TypeAdapter bekommen. Indem Sie

tun %Vor%

Ich erhalte einen Typ-Token für beide Modelle eines beliebigen Typs AnyType und den zugehörigen Adapter. Dies ist, was ich für ModelA benötige, aber für ModelB würde ich stattdessen den Adapter für List<AnyType> benötigen, was das Ergebnis der direkten Verwendung von ModelA<List<AnyType>> ist.

Verwendung der Schnittstelle des unformatierten Typs des ursprünglichen Token-Typs

%Vor%

Ich erhalte nur den Typ gelöschten Typ von List .

Wie kann ich diese beiden Informationen kombinieren, um den generischen List<AnyType> Typ zu erhalten oder direkt zu erstellen? Als Eingabe hat es nur den Typ Token für ModelB<AnyType> .

Beispiel

Für das gegebene Verhalten habe ich einen einfachen Test implementiert, der die Unterschiede zeigt. Ich habe den expected -Teil aus der Antwort von hahn mit der internen Nicht-API-Klasse $Gson$Types von Gson genommen.

%Vor%     
tynn 25.08.2016, 09:53
quelle

2 Antworten

3

Es gibt eine $Gson$Types , die Sie verwenden können, um Type der eingegebenen List abzurufen. Zum Beispiel mit:

%Vor%

würde Type mit rawType auf List und mit typeArguments auf [String] zurückgeben. So behalten Sie die Typen, wie Sie brauchen.

und dann Ausführen dieses Blocks

%Vor%

würde mit dem Adapter von CollectionTypeAdaptorFactory mit elementTypeAdapter.type auf die Klasse String gesetzt werden.

    
hahn 29.08.2016 15:10
quelle
1

Wenn Sie .getType() anstatt .getRawType() verwenden, scheint die gesuchte Information erhalten zu bleiben:

%Vor%

Hoffentlich können Sie herausfinden, wie Sie TokenAdaptors von dort erstellen können.

    
Valentin Ruano 28.08.2016 02:41
quelle