ahs*_*ele 26 java generics json gson
我正在尝试创建一个用于Google Gson的通用类.我创造了这门课GsonJsonConverterImplementation<T>.该类具有以下方法:
public T deserialize(String jsonString) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("MM/dd/yy HH:mm:ss");
Gson gson = builder.create();
return gson.fromJson(jsonString, T); // T.class etc. what goes here
}
Run Code Online (Sandbox Code Playgroud)
目标是这个方法应该能够使用我设置的GsonJsonConverterImplementation所使用的任何类型.不幸的是,gson.fromJson(jsonString, T)它不起作用,也没有用来T.class代替T.我确信这个问题源于我对Java泛型类型缺乏了解.在Gson中使用泛型的正确方法是什么?
编辑
使用Kris的答案我会认为这应该有效.不幸的是,clazz不能以这种方式使用并导致编译器错误.使用Gson的集合和泛型类型有哪些选择?
public List<T> deserializeList(String jsonString, Class<T> clazz) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("MM/dd/yy HH:mm:ss");
Gson gson = builder.create();
Type listType = new TypeToken<clazz>(){}.getType(); // compiler error
return gson.fromJson(jsonString, listType);
}
Run Code Online (Sandbox Code Playgroud)
Kri*_*bic 36
您尝试的最简单的方法是定义要在方法签名本身中返回的类的类型.您可以通过将'T'实例传递给方法或将要返回的值的Class传递给它.第二种方法是在您希望生成返回值的情况下更典型.以下是使用Gson的这种方法的示例:
public <T> T deserialize(String jsonString, Class<T> clazz) {
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("MM/dd/yy HH:mm:ss");
Gson gson = builder.create();
return gson.fromJson(jsonString, clazz);
}
Run Code Online (Sandbox Code Playgroud)
用法:
MyClass mc = deserialize(jsonString, MyClass.class);
Run Code Online (Sandbox Code Playgroud)
要获得运行时类型List<T>,给定类T,它会很糟糕,因为JDK认为我们不需要它,所以没有支持.你可以继承ParameterizedType,但它真的很糟糕.
Type typeListT = new ParameterizedType()
{
public Type[] getActualTypeArguments()
{
return new Type[]{clazz};
}
public Type getRawType()
{
return List.class;
}
public Type getOwnerType()
{
return null;
}
public boolean equals(Object obj)
{
// must implement equals per spec. this sucks
}
public int hashCode()
{
// this blows! Java forgot to specific it!
// since we override equals, we should override hashCode
// we have no idea what value should be returned here!
// note we are co-existing with other ParameterizedType impls
}
};
Run Code Online (Sandbox Code Playgroud)