Java类型隐式转换问题

博客讨论了在使用Gson库时遇到的一个问题,即在将JSON字符串转换为`Set<Integer>`时,由于使用了`HashSet.class`,导致实际转换成了`Set<String>`,引发类型错误。作者提供了正确的解决方案,使用`TypeToken`来指定目标类型,避免了类型转换错误。文章呼吁开发者注意在处理复杂类型转换时的类型匹配,以防止类似的坑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题代码:

@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>,以致踩坑。

更深层原因,欢迎大家交流和指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值