/**
* 实现命令 : LPUSH key 元素1 [元素2 ...]
* 在最左端依次推入元素
*
* @param key
* @param values
* @return 执行 LPUSH 命令后,列表的长度。
*/
@Nullable
public Long lPush(String key, Object... values) {
try {
return redisTemplate.opsForList().leftPushAll(key, values);
} catch (Exception e) {
LOGGER.error("操作 Redis 出错", e);
return null;
}
}
/**
* 实现命令 : LPUSH key 元素1 [元素2 ...]
* 在最左端依次推入元素
*
* @param key
* @param values
* @return 执行 LPUSH 命令后,列表的长度。
*/
@Nullable
public Long lPush(String key, Collection<Object> values) {
try {
return redisTemplate.opsForList().leftPushAll(key, values);
} catch (Exception e) {
LOGGER.error("操作 Redis 出错", e);
return null;
}
}
如上两个方法构成重载,按如下方式调用
List<String> list = new ArrayList<>();
list.add("test");
list.add("test2");
redisOperator.lPush("wqlm", list);
请问调用的是哪个 lPush?
按理说,我传的是 list,应该调用的是 lPush(String key, Collection<Object> values) 这个lPush,但实际上调用的是 lPush(String key, Object... values)这个lPush。
原因就出在 Object 身上,list 不仅是 Collection 类型,同时也是 Object 类型!!!
总结
可变参尽量不要使用 Object 作为形参,它会导致方法的所有重载都失效