问题代码:
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Rules implements Serializable {
private Set<Integer> uidTypes;
private Set<Integer> reportTypes;
}
Gson gson = new Gson();
Rules rules = new Rules();
rules.setUidTypes(gson.fromJson(jsonElement, HashSet.class));
类Rules的reportTypes属性是Set<Interger>,但经过gson.fromJson转换后的结果赋值后,实际变成Set<String>,以致后面使用使用reportTypes的时候,一直报类型错误。
看来gson.fromJson的第二个参数HashSet.class有问题,导致隐式转换了类型,细思极恐!
正确代码:
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Rules implements Serializable {
private Set<Integer> uidTypes;
private Set<Integer> reportTypes;
}
Gson gson = new Gson();
Rules rules = new Rules();
rules.setUidTypes(gson.fromJson(entry.getValue(), new TypeToken<Set<Integer>>(){}.getType()));
原因分析:
大概原因分析:reportTypes是复杂类型Set<Ingeger>,gson.fromJson转换的时候用HashSet.class,被强制转换成Set<String>,以致踩坑。
更深层原因,欢迎大家交流和指教!