java中参数为泛型的方法,如何返回List?

码上中国博客 发布于 2021/10/26 22:15
阅读 944
收藏 0

有如下一个方法:

    /**
     * 根据单个Key获取list结果
     *return myCacheManager.getListData(fullName,
     *                 () -> listAllBrands(fullName),122, UserInfo.class);
     * @param key
     * @param supplier
     * @param cacheTime
     * @param <V>
     * @return
     */
    public <V> List<V> getListData(String key, Supplier<List<V>> supplier, int cacheTime, Class<V> clazz) {
        List<V> result = (List<V>) redisCache.get(key, clazz);
        if (CollectionUtils.isEmpty(result)) {
            result = supplier.get();
            if (result != null && result.size() > 0) {
                redisCache.set(key, result, cacheTime);
            }
        }
        return result;
    }

最后一个入参为Class<V>,这个方法的本意是根据key查出一个List<UserInfo>,我是这样调用这个方法的

redisCacheService.getListData(String.format( RedisEnums.ADVER_POSITION.getKey(), positionCode),
                () -> this.getAdverListByPositionDb(positionCode, size), RedisEnums.ADVER_POSITION.getCacheTime(), UserInfo.class);

但是在运行时报了如下错误:

java.lang.ClassCastException: Cannot cast java.util.ArrayList to com.diyan.yihuijia.entity.outin.out.AdverInfoOut

我理解的意思是,我不应该传入UserInfo.class,但是我试着传入List.class也不可以,请问各位朋友,这个参数应该如何传值?

加载中
0
码上中国博客
码上中国博客

感谢各位朋友帮助,自己已经解决了,

/**
 * 根据单个Key获取list结果
 *return myCacheManager.getListData(fullName,
 *                 () -> listAllBrands(fullName),122, UserInfo.class);
 * @param key
 * @param supplier
 * @param cacheTime
 * @param <V>
 * @return
 */
public <V> List<V> getListData(String key, Supplier<List<V>> supplier, int cacheTime, Class<V> clazz) {
    List<V> result = (List<V>) redisCache.get(key, List.class);
    if (CollectionUtils.isEmpty(result)) {
        result = supplier.get();
        if (result != null && result.size() > 0) {
            redisCache.set(key, result, cacheTime);
        }
    }
    if (!CollectionUtils.isEmpty(result)) {
        return result.stream().map(e -> {
            return clazz.cast(e);
        }).collect(Collectors.toList());
    }
    return Lists.newArrayList();
}

另外,非常抱歉少贴代码了,少贴的代码在下面

    @Override
    public <T> T get(String key, Class<T> clazz) {
        Object res = redisTemplate.opsForValue().get(key);
        if(res == null) return null;
        log.info("传入的类型:[{}]", clazz.getSimpleName());
        return clazz.cast(res);
    }

 

0
jams_n
jams_n

报的是集合转实体类异常,那你最基本的哪一行报错都没说出来,还有你redisCache 放的什么数据类型?非要让回答你的人去猜?

0
sprouting
sprouting

不知道你这里面是怎么写的

List<V> result = (List<V>) redisCache.get(key, clazz);

但是,redis里面的类转换异常有时候也和你的序列化选择有关系,建议你直接存字符串,取出来也是字符串,然后在做json字符串转对象操作

码上中国博客
码上中国博客
@Override public <T> T get(String key, Class<T> clazz) { Object res = redisTemplate.opsForValue().get(key); if(res == null) return null; log.info("传入的类型:[{}]", clazz.ge
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部