类型转换
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<int>是错的。
泛型可以看做Object处理,
float ff1 = (float)new Object();//对象可以转基本类型,可以看做一个特例,剩下的就好理解一些。