如何无需instanceof判断,构造与传入参数同类型的List实例?
实现与传入List同类型的副本(无需instanceof)
可以通过反射获取传入List的实际运行时类,再创建对应实例,完全不用手动判断类型。Java标准库的List实现(如ArrayList、LinkedList)都支持无参构造或带Collection参数的构造器,刚好能满足需求。
方案一:先创建空实例再复制元素
import java.util.List; import java.util.Collection; import java.lang.reflect.Constructor; public static <E> void sorter(List<E> givenList) { List<E> copy; try { // 获取传入List的类对象,调用无参构造器生成空实例 Constructor<? extends List> constructor = givenList.getClass().getDeclaredConstructor(); copy = constructor.newInstance(); // 将原列表元素复制到新实例中 copy.addAll(givenList); } catch (Exception e) { // 若反射失败(比如自定义List无无参构造),兜底用ArrayList copy = new ArrayList<>(givenList); } // 这里可以对copy执行排序等操作 }
方案二:直接调用带Collection参数的构造器(更高效)
很多List实现都提供了接收Collection的构造器,能一步完成实例创建和元素复制:
import java.util.List; import java.util.Collection; import java.lang.reflect.Constructor; public static <E> void sorter(List<E> givenList) { List<E> copy; try { // 获取接收Collection参数的构造器,直接传入原列表生成副本 Constructor<? extends List> constructor = givenList.getClass().getDeclaredConstructor(Collection.class); copy = constructor.newInstance(givenList); } catch (Exception e) { // 异常兜底处理 copy = new ArrayList<>(givenList); } // 后续操作逻辑 }
注意事项
- 反射方式依赖目标List类提供对应的构造器,Java标准库的List实现都满足,但自定义List如果没有无参或带Collection的构造器,会触发异常进入兜底逻辑
- 捕获
Exception是简化写法,实际可以根据需要捕获具体异常(如NoSuchMethodException、InstantiationException等)
内容的提问来源于stack exchange,提问作者TheMireStudios
相关产品推荐
相关产品推荐

