redis使用保存List,List的size为1
问题描述
使用保存List,期望是直接将Java的List直接转换redis的list 。但是执行之后,却将整个list作为一个元素存到redis里面了 。代码demo如下
【redis使用rightPushAll保存List,List的size为1】@Controllerpublic class RedisTest {@Autowiredprivate RedisTemplate
执行想要的结果是size=3,list=[1, 2, 3] 。但是执行的结果却是size=1,list=[[1, 2, 3]]
问题定位
有两个重载方法:第一个方法形参的接收参数是一个可变长度的泛型参数列表,第二个方法形参的接收参数是泛型的 。
/** (non-Javadoc)* @see org.springframework.data.redis.core.ListOperations#rightPushAll(java.lang.Object, java.lang.Object[])*/@Overridepublic Long rightPushAll(K key, V... values) {byte[] rawKey = rawKey(key);byte[][] rawValues = rawValues(values);return execute(connection -> connection.rPush(rawKey, rawValues));}/** (non-Javadoc)* @see org.springframework.data.redis.core.ListOperations#rightPushAll(java.lang.Object, java.util.Collection)*/@Overridepublic Long rightPushAll(K key, Collection
因为调用方法实参是一个List,从语法上来说,两个重载方法是都可以调到的 。因为重载是Java编译时的多态性,那么编译器编译时会调用哪个方法呢?实参实现了接口,所以误认为会走(K key,)方法,但是是带泛型的,的value指定的泛型是,存值时保存的指定的泛型却是,虽然继承了,但是编辑器编辑时还是会优先选择调用(K key, V... )进行编译 。可以通过打断点或者查看字节码文件验证,确实调用的是(K key, V... )方法 。
![redis使用rightPushAll保存List,List的size为1](http://img.gansulong.com/231211/00310LD1-0.jpg)
文章插图
解决方案:
指定的value值和传入的value值的泛型类型保持一致 。比如上文中的例子,只需将;改为;或者 不变将= new ();改为= new ();
问题疑惑
为什么编译器会优先走(K key, V... )方法?重载的顺序到底是怎么样的?特别是泛型或者可变参数列表的形参,编译的原理是怎样的?欢迎有答案的小伙伴给我留言或者粘贴相关资料链接
- Axure PR的使用
- csdn markdown编辑器 表格使用说明及列宽度调整、对齐方式等问题处理
- AI大模型的使用-语义检索,利用Embedding优化你的搜索功能
- Google 的客户参与团队解释了他们如何使用人工智能来取悦全球数十亿用户
- 百度AIStudio使用初体验
- 侦测心跳就能得知身分的系统?美研发使用激光振动技术的Jetson系统
- 何时使用基于CRDT的数据库
- 为什么选择使用 OKR 进行项目过程管理
- 使用java发送zip文件到邮箱_jmeter使用总结
- valor的作用、使用