likes
comments
collection
share

泛型擦除问题导致的事故-踩坑集锦 27(一周一更)

作者站长头像
站长
· 阅读数 52

背景

开发需求中,往redis中存的数据为Set集合数据,取的时候,采用的是Set,底层并未去做类型转换,由于泛型擦除,从而导致逻辑判断中导致逻辑结果不符合预期结果的情况。 下面这个问题导致了我们的一个业务逻辑判断错误,引发了一起事故,下面我们来看下问题的复现以及解决。

问题复现

错误代码样例

存入时:redis.set(key, JSON.toJSONString(t)); 取出时:JSON.parseObject(redis.get(key),cls);

@Test
public void test5(){
  Set<String> set = new HashSet<>();
  set.add("111");
  set.add("222");
  redis.put("jyxset",set);

  Set<Long> res = redis.get("jyxset",Set.class);
  System.out.println(res.contains(111L));
}

打印结果:false

原因

通过上面代码复现可以看到Set res = redis.get( "jyxset" ,Set.class);本身并不会发生编译错误,按照我们想要的结果,认为res中数据为Long型,实际则还是String类型,所以在与111L做比较时,两者在运行期间并不相等,故而返回false

解决方法

1. 在进行比较时,数据类型与存入时数据类型保持一致;

2.如果采用Long型做比较,则数据取出时,进行数据结构的转换。

转载自:https://juejin.cn/post/7139552409763708965
评论
请登录