泛型擦除问题导致的事故-踩坑集锦 27(一周一更)
背景
开发需求中,往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