List<T> 类型数据通过 get(i) 无法获取原始类型的对象?

List<T> 类型的集合 list,通过 get(0) 是不是获取 T 类型的对象?为什么会在这里报错,看下面图片
image.png

下面是 transSourceToTarget 所在类的源码

package com.xdf.xzymanagementsystem.util;

import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;

@Component
public class CustumDozerMapperUtils {
    private Mapper mapper;

    @Autowired
    public void setMapper(Mapper mapper) {
        this.mapper = mapper;
    }

    /**
     * 转换集合
     *
     * @param list
     * @param clazz
     * @return
     */
    public <T, V> List<V> transSourceToTarget(List<T> list, Class<V> clazz) {
        if (list == null) return null;
        List<V> target = new ArrayList<>();
        for (T t : list) {
            target.add(mapper.map(t, clazz));
        }
        return target;
    }

    /**
     * 转化对象
     *
     * @param source
     * @param clazz
     * @param <T>
     * @param <V>
     * @return
     */
    public <T, V> V transObject(T source, Class<V> clazz) {
        if (source == null) return null;
        return mapper.map(source, clazz);
    }

    /**
     * 是否为空
     *
     * @param list
     * @return
     */
    public static boolean isEmpty(List list) {
        return list == null || list.size() <= 0;
    }

}
阅读 3.5k
5 个回答

是不是用了spring-devtools热部署?
热部署使用RestartClassLoader,而运行中使用的AppClassLoader所以导致了ClassCastException。
你可以打印看下加载器。

这种同一个类不能 cast 到自己大概率是 ClassLoader 的问题。

肯定是你transSourceToTarget写错了,导致此T非彼T。

可能是类加载器的问题,也许你可以设定下
org.dozer.util.DozerClassLoader

ClassLoader问题上面已经提到了, 其实可以用 org.springframework.beans.BeanUtils.copyProperties代替复制

这是我经常使用的工具类

public class StreamUtil {

    public static <T> Function<Object, T> copy(Supplier<T> supplier) {
        return it -> {
            final T target = supplier.get();
            BeanUtils.copyProperties(it, target);
            return target;
        };
    }
}

使用方法

final List<AwardFirstTrialData> data = StreamUtil.safeStream(awardFirstTrialMapper.selectByPagination(query, pagination))
                .map(StreamUtil.copy(AwardFirstTrialData::new))
                ....
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题