"
(T[]) Arrays.copyOf(elementData, size, a.getClass()); 强转可以成功是因为数组的类型本身就为a.getClass()。
public static T[] copyOf(U[] original, int newLength, Class extends T[]> newType) { @SuppressWarnings("unchecked") T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
通过Array.newInstance(newType.getComponentType(), newLength)创建的(目标类型)数组对象。
String[] y = (String[]) x.toArray()无法强制转换是因为array的数据类型为Object[]而不是String[]。######
String 是 Object 的子类,但是 String[] 不是 Object[] 的子类,所以对于实际类型是 String 的 Object 引用是可以强转成 String 的。但是 Object[] 怎么都不能强转成 String[],只能采用个个赋值的方式,把里面的引用挨个强转再拷贝过来(当然可以用 Arrays.copyOf() 来做这个事情。######
把子類的值轉回子類才是合法的
把Object[]的值cast成String[], 這個行為和(Integer)(new Object())同類######
ArrayList的泛型E不是必选的,当未指定泛型的时候,例如:
ArrayList list = new ArrayList();
list.add("test");
list.add(123);
list.add(11.22);
这种情况第二种方法是不适用的,也没办法做强制类型转换######
提示:关键还是要看清楚源码List list = new ArrayList();list.add(1);1.先分析list.toArray();Integer[] newArray = (Integer[])list.toArray();//会报错list.toArray(new Integer[1]);//不会报错这个方法其实调用的是下面这个方法Arrays.copyOf(elementData, size); 而这里的elementDate是什么?ArrayList,大家应该知道ArrayList底层是数组实现的。那么问题来了,这个底层的数组是什么,里面的元素是什么类型?看一眼源码就知道,这个数组是Object[],为啥是这个啊,不是Integer[]?因为泛型会擦除啊,所以底层的数组里面的元素是Object类型,而不是Integer,只有当取出元素的时候才会强转成Integer,具体了解泛型去吧。接着Arrays.copyOf(elementData, size);这个方法会调用如下方法Arrays.copyOf(original, newLength, original.getClass());最重要的一点来了,这个方法里面有个三目运算T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
这个三目运算意思是说,如果你给我的那个数组,是Object[]的,那么我的T[]就是Object[]的,实际就是T[] copy = new Object[1];如果你给我的不是Objcet[].class的,那么我就newInstance一个实际类型的T[],比如上面的list.toArray(new Integer[1]);实际就是:T[] copy = new Integer[1];答案已经有了啊,很明显的:T[] copy = new Object[1]; copy不能强制转换为 Integer[]; 为什么?因为如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的。T[] copy = new Integer[1]; copy能强制转换为 Integer[]; 为什么?因为如果父类引用的对象是指向子类的对象,那么在向下转型的过程中是安全的。不理解的兄弟们可以去看看java泛型的原理" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/388561be30914660a2cbd3d1d239600e.png)
Java 实体类泛型通用
转载文章标签 Java 实体类泛型通用 java 泛型 t是什么意思 数组 泛型 强制转换 文章分类 Java 后端开发
下一篇:gtest 打印 颜色
-
Java使用JsonNode判断实体类非空
使用jsonNode去判断实体类的参数是否为空
jsonnode java hutool