首页 >> 大全

redis使用rightPushAll保存List,List的size为1

2023-12-11 大全 30 作者:考证青年

redis使用保存List,List的size为1

问题描述

使用保存List,期望是直接将Java的List直接转换redis的list。但是执行之后,却将整个list作为一个元素存到redis里面了。代码demo如下

@Controller
public class RedisTest {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@ResponseBody@GetMapping("/test")public Long test(){String key = "test";redisTemplate.delete(key);ArrayList<String> arrayList = new ArrayList<>();arrayList.add("1");arrayList.add("2");arrayList.add("3");Long size = redisTemplate.opsForList().rightPushAll(key, arrayList); //output 1System.out.println(redisTemplate.opsForList().size(key));List<Object> range = redisTemplate.opsForList().range(key, 0, -1);//output [[1, 2, 3]]System.out.println(range);return size;}
}

执行想要的结果是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<V> values) {byte[] rawKey = rawKey(key);byte[][] rawValues = rawValues(values);return execute(connection -> connection.rPush(rawKey, rawValues));}

因为调用方法实参是一个List,从语法上来说,两个重载方法是都可以调到的。因为重载是Java编译时的多态性,那么编译器编译时会调用哪个方法呢?实参实现了接口,所以误认为会走(K key, )方法,但是是带泛型的,的value指定的泛型是,存值时保存的指定的泛型却是,虽然继承了,但是编辑器编辑时还是会优先选择调用(K key, V... )进行编译。可以通过打断点或者查看字节码文件验证,确实调用的是(K key, V... )方法。

用于保存当前正在执行的指令_使用保存命令得到的文件格式是_

解决方案:

指定的value值和传入的value值的泛型类型保持一致。比如上文中的例子,只需将 ;改为 ;或者 不变将 = new ();改为 = new ();

问题疑惑

为什么编译器会优先走(K key, V... )方法?重载的顺序到底是怎么样的?特别是泛型或者可变参数列表的形参,编译的原理是怎样的?欢迎有答案的小伙伴给我留言或者粘贴相关资料链接

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了