【问题标题】:How to cast a multidimensional array without knowing the dimension in Java如何在不知道 Java 维度的情况下转换多维数组
【发布时间】:2020-01-12 15:31:10
【问题描述】:

有一个多维 String 数组作为 Object 传入。
我应该“展开”它并处理它的每个原始条目。 除了查看Object 本身之外,没有办法知道尺寸。

我遇到的困难在于选角。我可以通过调用它的getClass().getName() 并在那里计算[-s 来查找数组维度。

那么如何施放呢?

String[] sa = (String[]) arr;

给予

Exception in thread "main" java.lang.ClassCastException: [[Ljava.lang.String; cannot be cast to [Ljava.lang.String;

可以在不使用任何反射的情况下完成这种转换吗?

注意 - 数组可以是任意维度 - 不仅仅是 1 或 2。

TIA。

【问题讨论】:

    标签: java arrays multidimensional-array casting


    【解决方案1】:

    如果您想使用在编译时未知维度的数组,我建议您递归处理其所有条目,而不是尝试强制转换。

    您可以使用object.getClass().isArray() 方法检查当前条目是否为数组,然后使用Array.getLength(object)Array.get(object, i) 对其进行迭代:

    public static void main(String[] args) {
        Object array = new String[][] {new String[] {"a", "b"}, new String[] {"c", "d"}};
        processArray(array, System.out::println);
    }
    
    public static void processArray(Object object, Consumer<Object> processor) {
        if (object != null && object.getClass().isArray()) {
            int length = Array.getLength(object);
            for (int i = 0; i < length; i ++) {
                Object arrayElement = Array.get(object, i);
                processArray(arrayElement, processor);
            }
        } else {
            processor.accept(object);
        }
    }
    

    【讨论】:

    • 我希望完全避免反射,但我想这是不可能的。喜欢你的回答。
    【解决方案2】:

    如果数组的大小不是静态已知的(在编译时),那么仅依靠静态方法(即不使用动态方法)获得长度在逻辑上是不可能的。

    也许这个问题有你需要的解决方案: Getting the field "length" in a Java array using reflection

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 2016-05-12
      • 2018-03-26
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多