如何用List<Class<? extends Some>>调用接收List<Class<?>>的方法?
问题原因
Java泛型是不变的,List<Class<? extends Some>> 和 List<Class<?>> 是完全独立的类型,无法直接转换。这是出于类型安全的考虑——如果允许这种转换,doSome 方法里可能会向列表中添加不符合原泛型约束的元素(比如Class<Unrelated>),破坏原列表的类型一致性。
其他解决方案
调整方法参数泛型(推荐)
修改doSome的参数类型为List<? extends Class<?>>,利用泛型协变特性兼容所有List<Class<? extends X>>类型的输入,同时保证类型安全(方法内无法向列表添加非null元素):static void doSome(final List<? extends Class<?>> classes) { // 原有逻辑不变,只要不执行添加元素的操作就没问题 }修改后直接调用
doSome(CLASSES1)即可,无需额外转换。安全强制类型转换
如果不想修改doSome方法,可以通过两次强制转换绕过编译检查(前提是确认doSome不会修改传入的列表):doSome((List<Class<?>>) (List<?>) CLASSES1);先转成
List<?>再转List<Class<?>>可以避免编译警告,但如果方法内有添加元素的操作,运行时可能抛出ClassCastException。Stream生成新列表
和你用new ArrayList<>(CLASSES1)的原理一致,通过Stream收集生成新的List<Class<?>>:import java.util.stream.Collectors; doSome(CLASSES1.stream().collect(Collectors.toList()));
内容的提问来源于stack exchange,提问作者Jin Kwon
相关产品推荐
相关产品推荐

