Java 如何将泛型对象强制转换为基元数组?
一维基元数组在泛型方法上无法正常工作。新的int[]应该作为T[]而不是T传递。由于isArray(),我能够区分数组,但在尝试执行数组时出现问题。deepToString()。如何将泛型对象强制转换为基元数组Java 如何将泛型对象强制转换为基元数组?,java,arrays,generics,Java,Arrays,Generics,一维基元数组在泛型方法上无法正常工作。新的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
/* 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);
}
}
}
/*输出
打印项次(T$obj)
1.
打印项次(T[]$obj)
[1]
打印项次(T[]$obj)
[[1]]
打印项次(T[]$obj)
[[[1]]]
打印项次(T$obj)
1.
打印项次(T$obj)
线程“main”java.lang.ClassCastException中的异常:[我无法转换为[Ljava.lang.Object;
at Test.doSomething(Test.java:21)
at Test.main(Test.java:12)
Java结果:1
*/
导入java.util.array;
公开课考试{
公共静态void main(字符串[]args)引发异常{
剂量计((整数)1);
doSomething(新整数[]{1});
doSomething(新整数[][{{1}});
doSomething(新整数[][]{{{1}}});
剂量测定法((int)1);
doSomething(新int[]{1});//java.lang.ClassCastException
doSomething(新int[][{{1}});
doSomething(新int[][]{{{{1}}});
}
公共静态无效剂量测定(T$obj){
系统输出打印项次(“打印项次(T$obj)”;
如果($obj.getClass().isArray()){
System.out.println(Arrays.deepToString((T[])$obj));//java.lang.ClassCastException
}否则{
系统输出打印项次($obj);
}
}
公共静态无效剂量测定(T[]$obj){
System.out.println(“println(T[]$obj)”;
如果($obj.getClass().isArray()){
System.out.println(Arrays.deepToString($obj));
}否则{
系统输出打印项次($obj);
}
}
}
你不能。数组。deepToString()
接受参数对象[]
,它不是一个基元数组类型的子类型。如果你知道你有一个基元数组,你可以简单地对它调用数组。toString()
(因为基元数组不能是“deep”),它对所有基元类型数组重载
唯一的另一种情况是,你有一些东西可能是一个基元数组,或者一个引用数组,但你不知道是哪一个,如果是一个引用数组,你想以递归的方式深度打印它。你可以编写自己的方法,根据每个基元数组类型手动检查对象的类型,如果是,则使用c将其转换为正确的类型并对其调用Arrays.toString()
,如果它是引用数组,则将其转换为Object[]
并对其调用Arrays.deepToString()
或者,如果您很懒,您可以将任何内容包装到一个附加的数组层中,然后在该层上执行Arrays.deepToString()
:
Arrays.deepToString(new Object[]{$obj})
然后去掉额外的一组括号。您不能将Java泛型与基本类型一起使用(至少不装箱到相应的包装器类型)。为此,您需要类似于
publicstaticvoiddosomething(t[]$obj)
或类似于publicstaticvoiddosomething的varargs版本(T.$obj)
使用开关
打开应该可以做到这一点。