Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将泛型对象强制转换为基元数组?_Java_Arrays_Generics - Fatal编程技术网

Java 如何将泛型对象强制转换为基元数组?

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

一维基元数组在泛型方法上无法正常工作。新的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);
        }
    }
}
/*输出
打印项次(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)
使用
开关
打开应该可以做到这一点。