泛型原始类型的使用
来源:4-5 使用原始类型可能会出现灾难性后果
SuccessorSocialism
2020-09-06
一哥我使用的web框架名字就不提了 ,在它的redis操作行为里面,有一个根据redisKey获取 Hash的 所有field的value的接口
其代码如下:
/** * 返回哈希表 key 中所有域的值。 */ public List hvals(Object key);
当我在使用这个接口获取某个redisKey的Hash值的List时:
// 1.是应该以: List list = redis.hvals(key); //获取原始类型的List // 2.还是应该以一个具体的类型类型获取: List list = redis.hvals(key); // 3.还是说 以List 接受,然后在用JSON方法把List 转为具体的类型: List objects= redis.hvals(key); List list = JSON.parseArray(JSON.toJSONString(objects), Integer.class);
在使用第一种的使用 IDEA会提示"Raw use of parameterized class 'List'"的警告
但是使用第二种的时候IDEA也会提示 “Unchecked assignment: 'java.util.List' to 'java.util.List'”警告
第三种的话感觉太繁琐了一点
还是说我直接在方法上面加入 “@SuppressWarnings("rawtypes")”这个 屏蔽警告 ,然后继续用第二种的方式进行get List的操作?
1回答
-
鲲鲲你好:
首先,我是知道的,你使用的框架被称为 “国货之光”!
我猜测这是框架本身的限制,导致从 Redis 中读取数据的时候,没有接口让你直接指定数据的类型。那么,我们可以思考下 SpringBoot 中的 RedisTemplate 是怎么做的呢?
这就又要从 Redis 去谈起了:如果你对 Redis 很熟悉,你会知道,Redis 有很多种数据类型,但是,所有的数据都是字符串。那么,RedisTemplate 做的工作也很简单了,它也会从 Redis 中读取到字符串,然后根据你的类型设置,反序列化为具体的对象。也就是说,RedisTemplate 在最开始从 Redis 中读取的一定是 “原始类型”。
既然 “国货之光”不支持直接获取泛型的接口,那么,我个人觉得,直接读取原始类型,或者使用第三种方式自己指定都是可以的。因为这个是框架本身的限制,除非自己去定义一个 JbootRedisTemplate(这也没有意义,大量的工作都已经在 SpringBoot 中实现过了),否则,没有好的办法了。
我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!
212020-09-11
相似问题