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&lt;T&gt; 类型数据通过 get(i) 无法获取原始类型的对象? 的全部内容, 来源链接: utcz.com/p/944276.html

回到顶部