Java如何实现任意维度ArrayList存储及接收对应参数的泛型方法
任意维度ArrayList的Java实现方案
Java泛型属于编译期校验逻辑,运行时会发生类型擦除,因此无法直接声明一个通用的「N维ArrayList」类型来自动适配所有维度,下面是3种可落地的实现思路:
方案1:通配符适配任意维度入参
如果仅需要实现接收任意维度ArrayList的方法,不需要强校验维度结构,可以直接用?通配符声明入参,运行时递归判断元素类型即可:
// 通用处理任意维度ArrayList的方法 public void processMultiDimList(ArrayList<?> list) { for (Object element : list) { if (element instanceof ArrayList) { // 是子维度列表,递归处理 processMultiDimList((ArrayList<?>) element); } else { // 命中最底层元素,执行自定义业务逻辑 System.out.println("处理底层元素:" + element); } } }
调用时无需额外转换,任意维度的ArrayList都可以直接传入:
// 二维列表调用示例 ArrayList<ArrayList<Integer>> twoDList = new ArrayList<>(); processMultiDimList(twoDList); // 三维列表调用示例 ArrayList<ArrayList<ArrayList<String>>> threeDList = new ArrayList<>(); processMultiDimList(threeDList);
该方案优势是实现简单无侵入,缺点是编译期不会校验入参的嵌套结构,需要运行时自行做类型判断兼容。
方案2:自定义通用多维容器类
如果需要强类型约束、统一管控维度,可以自行封装多维List类,内部封装维度信息和存储结构:
public class MultiDimList<T> { private final int dimension; private final Object storage; // 实际存储的ArrayList嵌套结构 // 构造方法指定维度 public MultiDimList(int dimension) { if (dimension < 1) throw new IllegalArgumentException("维度不能小于1"); this.dimension = dimension; this.storage = initDimStructure(dimension); } // 递归初始化指定维度的嵌套ArrayList private Object initDimStructure(int currentDim) { if (currentDim == 1) return new ArrayList<T>(); ArrayList<Object> level = new ArrayList<>(); level.add(initDimStructure(currentDim - 1)); return level; } // 按坐标获取元素,坐标数量必须等于维度 @SuppressWarnings("unchecked") public T get(int... indexes) { if (indexes.length != dimension) throw new IllegalArgumentException("坐标数必须匹配维度:" + dimension); Object current = storage; for (int i = 0; i < indexes.length; i++) { current = ((ArrayList<?>) current).get(indexes[i]); } return (T) current; } // 按坐标设置元素 @SuppressWarnings("unchecked") public void set(T value, int... indexes) { if (indexes.length != dimension) throw new IllegalArgumentException("坐标数必须匹配维度:" + dimension); Object current = storage; for (int i = 0; i < indexes.length - 1; i++) { current = ((ArrayList<?>) current).get(indexes[i]); } ((ArrayList<T>) current).set(indexes[indexes.length - 1], value); } }
调用示例:
// 初始化3维Integer类型列表 MultiDimList<Integer> threeDList = new MultiDimList<>(3); // 设置坐标为0,1,2的元素 threeDList.set(100, 0, 1, 2); // 获取对应元素 Integer val = threeDList.get(0, 1, 2);
该方案优势是维度统一管控,编译期可以约束存储的元素类型,缺点是需要自行封装所有需要的List操作方法。
方案3:递归泛型边界约束(适合维度有上限的场景)
如果你的业务场景维度有固定上限,可以用递归泛型边界提前声明对应维度的类型,编译期就可以做维度校验:
// 1维列表 public class Dim1<T> extends ArrayList<T> {} // 2维列表 public class Dim2<T> extends ArrayList<Dim1<T>> {} // 3维列表 public class Dim3<T> extends ArrayList<Dim2<T>> {} // 以此类推到你需要的最大维度即可
方法入参可以直接用这些自定义类型做泛型约束,就能实现编译期维度校验。
内容的提问来源于stack exchange,提问作者ghosts
相关产品推荐
相关产品推荐

