java1.8 stream关于类型转换的一些问题

类型转换

        double[] b1 = (double[])new Object();//Object 可以直接转换数组
        double[] b2 = (double[])new Object[3];//error 对象数组不能转基本类型数组
        Double[] b3 = new Double[3];
        double[] b4 = (double[])new Double[3];//error 对象数组不能转基本类型数组
        Double[] b5 = (Double[])new Object[3];

 先看一组流操作:

        Float[][] a = {{3F, 6F, 8F, 10F}, {4F, 5F, 6F, 7F}, {1F, 2F, 3F, 4F}};
        //转换想要的类型,注意入参Float[][] a,因为DoubleStream第一个.toArray()转换为double[],第二个转换为double[][]
        double[][] b = Arrays.stream(a).map(x-> Arrays.stream(x).mapToDouble(y->y.floatValue()).toArray()).toArray(double[][]::new);
        //转换Object[] 每个Object 是一个double[]类型
        Object[] c = Arrays.stream(a).map(x-> Arrays.stream(x).mapToDouble(y->y.floatValue()).toArray()).toArray();

在看一组操作,关注类型转换:

        double[][] aa = {{3F, 6F, 8F, 10F}, {4F, 5F, 6F, 7F}, {1F, 2F, 3F, 4F}};
        float[][] bb = {{3F, 6F, 8F, 10F}, {4F, 5F, 6F, 7F}, {1F, 2F, 3F, 4F}};
        double[] cc = {3F, 6F, 8F, 10F};
        float[] dd = {3F, 6F, 8F, 10F};
        Float[] ee = {3F, 6F, 8F, 10F};
        Arrays.stream(aa).map(x->Arrays.stream(x));//idea源码跟踪bug,实际对应入参T[]
        Arrays.stream(bb).map(x->Arrays.stream(x));//error,float[] 无法映射 T[]
        Arrays.stream(cc);//只支持Int[] Double[] Long[] 或者 T[]
        Arrays.stream(dd);//error,不支持基本类型 float[] ,因为 float[] 可以转换成 Object 但是不能转换Object[]!
        // but,
        float ff1 = (float)new Object();//对象可以转基本类型
        float[] ff2 = (float[])new Object();//对象可以转基本类型数组
        Float[] ff3 = (Float[])new Object[1];//对象数组可以转包装类型数组
        float[] ff4 = (float[])new Object[2];//error,对象数组不能转基本类型数组
        float[][] ff5 = (float[][]) new Object[3];//多维数组可以降维看做float[]转换为Objext
        float[][][] ff6 = (float[][][]) new Object[4];//同上
        Arrays.stream(ee);//需要用包装类

以上代码应该可以推倒出结论,

从Object角度来看:

Object可以转换成任何包装类型和基础类型,

Object数组只能转换包装类型数组

从基本类型和包装类型角度来看:

基本类型的数组,只能由Object转换,也意味着应当做Object看待。

基本类型的多维数组,可以由Object数组转换,但是基本类型数组维度至少大于Object数组维度1,见ff5,ff6。

包装类型的数组和多维数组,可以由Object或者Object数组转换,需保证包装类型数组维度,不大于Object维度。

或者当一个特例理解,再慢慢分析:

基本类型可以由Object转换,但是基本类型数组,不能由Object数组转换。

包装类型可以由Object转换,包装类型数组,可以由Object数组转换。

我的猜测是JVM会把数组当做Object处理,但是基本类型不会当做Object处理。

意味着,基本类型会当做基本类型处理,

基本类型的数组,会当做Object,不会当做Object数组。

下面添加一些代码测试,符合上面的验证推论逻辑:

        Float[][] a = {{3F, 6F, 8F, 10F}, {4F, 5F, 6F, 7F}, {1F, 2F, 3F, 4F}};
        double[][] bb0 =Arrays.stream(a).map(x-> Arrays.stream(x).map(y->y.doubleValue()).toArray(double[]::new)).toArray(double[][]::new);//error 无法映射 T[]
        Double[][] bb1 =Arrays.stream(a).map(x-> Arrays.stream(x).map(y->y.doubleValue()).toArray(Double[]::new)).toArray(Double[][]::new);//
        double[][] bb2 =Arrays.stream(a).map(x-> Arrays.stream(x).map(y->y.doubleValue()).toArray(Double[]::new)).toArray(double[][]::new);//error,Double[]和double[]无法互相转换
        double[][] bb3 = Arrays.stream(a).map(x-> Arrays.stream(x).mapToDouble(y->y.floatValue()).toArray()).toArray(double[][]::new);
        Double[][] bb4 = Arrays.stream(a).map(x-> Arrays.stream(x).mapToDouble(y->y.floatValue()).toArray()).toArray(Double[][]::new);//error,Double[]和double[]无法互相转换
        Object[][] bb5 = Arrays.stream(a).map(x-> Arrays.stream(x).map(y->y.doubleValue()).toArray()).toArray(Object[][]::new);

附一个判断数组的代码:

public static boolean isArray(Object obj) {
        if (obj == null) {
            return false;
        }
        return obj.getClass().isArray();
}

补充一下:

泛型不支持基本类型,要求是个对象,例如List是错的。

泛型可以看做Object处理,

float ff1 = (float)new Object();//对象可以转基本类型,可以看做一个特例,剩下的就好理解一些。

 

 

 

 

 

 

 

你可能感兴趣的:(java)