Java中如何处理维度数未知的数组 n维数组适配什么数据类型
结论
Java 编译期不存在可以承载任意n维原生数组的静态类型,你代码中所有标记???的位置,唯一合法的类型就是Object。
原因说明
- 数组维度是Java数组类型的固有组成部分:
T[]、T[][]、T[][][]属于完全独立的不同类型,不存在一个通用的数组父类型可以覆盖所有维度的数组实例,所有数组对象唯一的公共父类就是Object。 - JDK中
Array.newInstance(Class<?> componentType, int... dimensions)方法本身的返回值就定义为Object,这是刻意设计:数组维度由传入的维度数组长度动态决定,编译阶段不可能提前推断出具体的数组类型,自然无法提供匹配的强类型声明。
原生数组的可用操作方案
如果你坚持使用Java原生数组,不需要自定义链式封装类,可以通过两种方式解决操作问题:
- 如果调用处明确知道数组维度,直接强转为对应维度的数组类型即可,类型安全由调用方保证
@SuppressWarnings("unchecked") public static <T> Object createMultidimensionalArray(Class<T> clazz, int dimensions, int dimensionLength) { int[] dimArr = new int[dimensions]; for (int i = 0; i < dimensions; i++) { dimArr[i] = dimensionLength; } Object targetArray = Array.newInstance(clazz, dimArr); return targetArray; } // 调用示例:明确是3维int数组时直接强转 int[][][] threeDArr = (int[][][]) createMultidimensionalArray(int.class, 3, 5); threeDArr[0][0][0] = 1; - 如果运行时才能确定维度,不需要强转,直接用
java.lang.reflect.Array工具类操作即可,不需要提前知道数组维度// 通用的n维数组取值方法 public static Object getArrayElement(Object nDimensionalArray, int... indices) { Object current = nDimensionalArray; for (int index : indices) { current = Array.get(current, index); } return current; } // 通用的n维数组赋值方法 public static void setArrayElement(Object nDimensionalArray, Object value, int... indices) { Object current = nDimensionalArray; // 先逐层定位到倒数第二层 for (int i = 0; i < indices.length - 1; i++) { current = Array.get(current, indices[i]); } // 给最后一维赋值 Array.set(current, indices[indices.length - 1], value); }
内容的提问来源于stack exchange,提问作者Japhei
相关产品推荐
相关产品推荐

