List<T> 类型数据通过 get(i) 无法获取原始类型的对象?
List<T> 类型的集合 list,通过 get(0) 是不是获取 T 类型的对象?为什么会在这里报错,看下面图片
下面是 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;
}
}
回答:
是不是用了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))
....
以上是 List<T> 类型数据通过 get(i) 无法获取原始类型的对象? 的全部内容, 来源链接: utcz.com/p/944276.html