gpt4 book ai didi

java - 如何将通用对象转换为原始数组?

转载 作者:行者123 更新时间:2023-11-30 07:34:19 25 4
gpt4 key购买 nike

单维基本数组在泛型方法上无法正常工作。 new int[] 应该作为 T[] 而不是 T 传递。感谢 isArray(),我能够区分数组,但在尝试执行 Arrays.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);
}
}
}

最佳答案

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

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

或者,如果你很懒,你可以将任何内容包装在额外的一层数组中,然后执行 Arrays.deepToString()对此:

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

然后去掉多余的括号。

关于java - 如何将通用对象转换为原始数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com