【发布时间】:2017-05-30 18:06:27
【问题描述】:
我在将列表类型从反射对象转换为该对象的 set 方法时遇到问题。
我不确定问题是在前端还是在 Gson 解析端,但我的测试代码在这里:
public static void main(String[] args) throws Exception{
String json = "[52881]";
ListObject lo = new ListObject();
for(Field f : lo.getClass().getDeclaredFields())
if(List.class.isAssignableFrom(f.getType())){
Method m = lo.getClass().getMethod(
new StringBuilder("set").append(f.getName().substring(0,1).toUpperCase()).append(f.getName().substring(1,f.getName().length())).toString(),
f.getType()
);
System.out.println(((ParameterizedType) f.getGenericType()).getActualTypeArguments()[0]);
getListFromJson(m, lo, json,
((ParameterizedType) f.getGenericType()).getActualTypeArguments()[0].getClass());
}
ListObject p = (ListObject) lo;
System.out.println(gson.toJson(p.getAList()));
for(long pid : p.getAList()){
System.out.println(pid);
}
}
@SuppressWarnings("unchecked")
public static <T> void getListFromJson(Method m, Object target, String json, Class<T> elementType) throws Exception {
m.invoke(target, (List<T>)gson.fromJson(json, new TypeToken<List<T>>(){}.getType()));
}
还有 ListObject:
public class ListObject {
List<Long> aList = new ArrayList<Long>();
public List<Long> getAList() {
return aList;
}
public void setAList(List<Long> aList) {
this.aList = aList;
}
}
此测试程序产生以下输出:
类 java.lang.Long
[52881.0]
线程“main”java.lang.ClassCastException 中的异常:java.lang.Double 无法转换为 java.lang.Long 在 test.GenericTester.main(GenericTester.java:66)
第66行是
for(long pid : p.getAList()){
我在这里将这个答案用于 getList 方法: https://stackoverflow.com/a/18321048/2555197
【问题讨论】:
-
如错误消息所述,您无法将
52881.0Double 转换为 Long。检查您的输入数据 -
看你链接的问题的第二个答案,是正确的,接受的答案是错误的。
-
我也会研究第二个答案。
标签: java list generics serialization gson