有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将泛型对象转换为基元数组?

一维基元数组在泛型方法上无法正常工作。新的int[]应该作为T[]而不是T传递。由于isArray(),我能够区分数组,但在尝试执行数组时出现了问题。deepToString()。如何将泛型对象强制转换为基元数组

/* Output
println(T $obj)
1
println(T[] $obj)
[1]
println(T[] $obj)
[[1]]
println(T[] $obj)
[[[1]]]
println(T $obj)
1
println(T $obj)
Exception in thread "main" java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object;
    at Test.doSomething(Test.java:21)
    at Test.main(Test.java:12)
Java Result: 1
*/

import java.util.Arrays;

public class Test {

    public static void main(String[] args) throws Exception {
        doSomething((Integer) 1);
        doSomething(new Integer[]{1});
        doSomething(new Integer[][]{{1}});
        doSomething(new Integer[][][]{{{1}}});

        doSomething((int) 1);
        doSomething(new int[]{1}); //java.lang.ClassCastException
        doSomething(new int[][]{{1}});
        doSomething(new int[][][]{{{1}}});
    }

    public static <T> void doSomething(T $obj) {
        System.out.println("println(T $obj)");

        if ($obj.getClass().isArray()) {
            System.out.println(Arrays.deepToString((T[]) $obj)); //java.lang.ClassCastException
        } else {
            System.out.println($obj);
        }
    }

    public static <T> void doSomething(T[] $obj) {
        System.out.println("println(T[] $obj)");

        if ($obj.getClass().isArray()) {
            System.out.println(Arrays.deepToString($obj));
        } else {
            System.out.println($obj);
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    不能。Arrays.deepToString()接受参数Object[],该参数不是基元类型数组的子类型。如果你知道你有一个基元数组,你可以简单地对它调用Arrays.toString()(因为基元数组不能是“deep”),这对于所有基元数组类型来说都是重载的

    唯一的另一种情况是,你有一些东西可能是一个基元数组,或者一个引用数组,你不知道是哪个,如果是一个引用数组,你想以递归的方式深度打印它。您可以编写自己的方法,根据每个基元类型数组手动检查对象的类型,如果是,则将其转换为正确的类型并对其调用Arrays.toString(),如果是引用数组,则将其转换为Object[]并对其调用Arrays.deepToString()

    或者,如果你很懒,你可以把任何东西包装在一个额外的数组层中,然后在上面执行Arrays.deepToString()

    Arrays.deepToString(new Object[]{$obj})
    

    然后去掉多余的支架