代码之家  ›  专栏  ›  技术社区  ›  Koray Tugay

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

  •  -2
  • Koray Tugay  · 技术社区  · 6 年前

    我正在使用一个API,我需要在其中提供 Object[] , Object[][] , Object[][][] …你明白了。

    假定 setFoo 需要一个 对象[ ] ,这就是我让它工作的方式:

    Object hello = "Hello";
    Object world = "world";
    
    final List<Object> objects = new ArrayList<>();
    objects.add(hello);
    objects.add(world);
    
    // {"Hello", "world"}
    item.setFoo(objects.toArray());
    

    我就是这样做的 对象[][] 要求工作,这样我可以打电话 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);
    

    问题是,我无法弄清楚如何动态创建对象[][]。有没有办法在Java中做到这一点?如果我能让他 final Object[][] objects = new Object[surroundingList.size()][1]; 我应该掌握好动态。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Stephen C    6 年前

    用静态代码不能这样做。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 和/或

    • 使用杂乱的反射代码在阵列上执行操作。