如何将Java通配符List<?>转换为指定类型List<classType>
解决List<?>到指定类型List的转换问题
因为Java泛型存在类型擦除,编译时的泛型信息在运行时会被移除,所以没法直接通过运行时的Class对象生成带具体泛型的List类型。不过既然你已经确认reader返回的列表元素都是classType指定的类型,那可以通过非受检强制转换来实现,同时要做好安全说明。
方案1:直接在调用处做强制转换(不修改reader)
在转换时添加@SuppressWarnings("unchecked")注解消除编译警告,同时注释说明转换的安全性:
Class<?> classType = getClassType(""); List<?> rawList = reader.read(file, classType); // 强制转换,已确认reader返回的元素都是classType类型,转换安全 @SuppressWarnings("unchecked") List<Object> typedList = (List<Object>) rawList;
如果想更精准,可以把getClassType改成泛型方法,返回Class<T>:
public <T> Class<T> getClassType(String typeName) { // 原实现逻辑,返回对应类型的Class<T> }
调用时就能直接得到泛型匹配的列表:
Class<T> classType = getClassType(""); List<?> rawList = reader.read(file, classType); @SuppressWarnings("unchecked") List<T> typedList = (List<T>) rawList;
方案2:修改reader的read方法为泛型方法(推荐)
直接让read方法返回带泛型的List<T>,从根源上避免类型转换:
// 修改reader的read方法定义 public <T> List<T> read(File file, Class<T> classType) { List<T> result = new ArrayList<>(); // 原读取逻辑:将文件内容转换为T类型元素并添加到result中 return result; }
调用时无需额外转换,直接获取目标类型列表:
Class<T> classType = getClassType(""); List<T> list = reader.read(file, classType);
关键说明
- 非受检转换的警告是因为编译器无法在编译时确认类型安全,但你已经明确
reader返回的元素都是指定类型,所以这个转换是安全的。 - 优先选择修改
read方法为泛型方法,代码更简洁,还能在编译时提供类型检查。
内容的提问来源于stack exchange,提问作者sparrowTrajon
相关产品推荐
相关产品推荐

