如何在Java中动态声明数组的形状?

时间:2018-10-03 14:29:01

标签: java arrays

我正在使用一个API,需要提供Object[]Object[][]Object[][][] ...这个想法。

假设setFoo需要一个Object[],这就是我的工作方式:

Object hello = "Hello";
Object world = "world";

final List<Object> objects = new ArrayList<>();
objects.add(hello);
objects.add(world);

// {"Hello", "world"}
item.setFoo(objects.toArray());

这就是我使Object[][]需求工作的方式,以便我可以致电setBar

Object hello = "Hello";
Object world = "world";

// We now we need to stuff these into an Array of Arrays as in: {{Hello},{world}}
final List<Object> helloList = new ArrayList<>();
helloList.add(hello);

final List<Object> worldList = new ArrayList<>();
worldList.add(world);

final List<List<Object>> surroundingList = new ArrayList<>();
surroundingList.add(helloList);
surroundingList.add(worldList);

final Object[][] objects = new Object[surroundingList.size()][1];
for (int i = 0; i < surroundingList.size(); i++) {
    objects[i] = surroundingList.get(i).toArray();
}

item.setBar(objects);

问题是,我无法弄清楚如何动态创建Object [] [] []。在Java中有没有办法做到这一点?如果我可以让这个final Object[][] objects = new Object[surroundingList.size()][1];的家伙变得充满活力,那我应该很好。

1 个答案:

答案 0 :(得分:4)

您不能使用静态代码执行此操作。 Java语法和(编译时)类型系统不支持声明或构造具有不确定尺寸的数组。

您可以使用反射创建具有任意尺寸的数组;例如

int nosDimensions = 2;
Class<MyClass> clazz = MyClass.class;
Object array = java.lang.reflect.Array.newInstance(clazz, nosDimensions);

MyClass[][] typedArray = (MyClass[][]) array;  // just to show we can do it ...

但是问题是,如果您走这条路,很可能会失败:

  • 对具有确定尺寸的类型(请参见上面的typedArray)和/或

  • 进行大量转换
  • 使用混乱的反射代码对数组进行操作。