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 楼答案
不能。
Arrays.deepToString()
接受参数Object[]
,该参数不是基元类型数组的子类型。如果你知道你有一个基元数组,你可以简单地对它调用Arrays.toString()
(因为基元数组不能是“deep”),这对于所有基元数组类型来说都是重载的唯一的另一种情况是,你有一些东西可能是一个基元数组,或者一个引用数组,你不知道是哪个,如果是一个引用数组,你想以递归的方式深度打印它。您可以编写自己的方法,根据每个基元类型数组手动检查对象的类型,如果是,则将其转换为正确的类型并对其调用
Arrays.toString()
,如果是引用数组,则将其转换为Object[]
并对其调用Arrays.deepToString()
或者,如果你很懒,你可以把任何东西包装在一个额外的数组层中,然后在上面执行
Arrays.deepToString()
:然后去掉多余的支架