我正在使用一个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];
的家伙变得充满活力,那我应该很好。
答案 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
)和/或
使用混乱的反射代码对数组进行操作。