2

この問題を解決するには?型の安全性: 型 mResponseValue の式は、準拠するために未チェックの変換が必要ですmResponseValue<mUserStatus>

mResponseValue<mUserStatus> ResponseValue = Mobile.JSONtoClass(responseService, mResponseValue.class);

public abstract class Mobile {

 public static String ObjToJson(Object obj)
 {    
     Gson gson = new Gson();
       return gson.toJson(obj);
 }

 public static <T> T JSONtoClass(String strRequest,Class<T> type)
 {
     Gson gson = new Gson();
     return gson.fromJson(strRequest, type);
 }  

}

4

1 に答える 1

2

この問題の根本的な原因は型消去です。を呼び出すと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 ユーザー ガイドのジェネリック型のシリアル化と逆シリアル化を参照してください。

于 2013-08-21T12:01:29.693 に答える