Object 可变参导致的 Java 重载失效

106 阅读1分钟
/**
 * 实现命令 : 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 作为形参,它会导致方法的所有重载都失效