この問題の根本的な原因は型消去です。を呼び出すとMobile.JSONtoClass(responseService, mResponseValue.class);
、型パラメーターT
は に置き換えられmResponseValue
ますが、戻り値を割り当てているためmResponseValue<mUserStatus>
、チェックされていないキャストになります。
問題のある割り当ては、次の 2 つの部分に分けることができます。
mResponseValue rawResponseValue = = Mobile.JSONtoClass(responseService, mResponseValue.class); // OK
mResponseValue<mUserStatus> parameterizedResponseValue = rawResponseValue; // Warning: Type safety ...
したがって、簡単な解決策は callmResponseValue<mUserStatus>.class
の 2 番目のパラメーターとして使用することでしたが、型引数が消去されるため、実行時にJSONtoClass
そのようなことはありません。mResponseValue<mUserStatus>.class
この問題を回避するために、GSON は、ジェネリック型情報も保持するjava.lang.reflect.Typeを受け入れるメソッドを提供します。それらを使用すると、次のように警告を排除できます。
public static <T> T JSONtoClass(String strRequest, java.lang.reflect.Type typeOfT)
{
Gson gson = new Gson();
return gson.fromJson(strRequest, typeOfT);
}
次に、次のように呼び出します。
TypeToken<mResponseValue<mUserStatus>> typeToken = new TypeToken<mResponseValue<mUserStatus>>() {};
mResponseValue<mUserStatus> responseValue = Mobile.JSONtoClass(responseService, typeToken.getType());
このソリューションにより、コンパイラの警告が回避され、型情報の損失によって発生する可能性のある逆シリアル化/シリアル化の問題が実際に修正されます。詳細については
、Gson ユーザー ガイドのジェネリック型のシリアル化と逆シリアル化を参照してください。