Heim > Fragen und Antworten > Hauptteil
伊谢尔伦2017-04-18 10:44:06
(T[]) Arrays.copyOf(elementData, size, a.getClass());
强转可以成功是因为数组的类型本身就为a.getClass()
。
public static <T,U> 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[]
。
伊谢尔伦2017-04-18 10:44:06
String
是 Object
的子类,但是 String[]
不是 Object[]
的子类,所以对于实际类型是 String
的 Object
引用是可以强转成 String
的。但是 Object[]
怎么都不能强转成 String[]
,只能采用个个赋值的方式,把里面的引用挨个强转再拷贝过来(当然可以用 Arrays.copyOf()
来做这个事情。
伊谢尔伦2017-04-18 10:44:06
把子類的值轉回子類才是合法的
把Object[]的值cast成String[], 這個行為和(Integer)(new Object())
同類
阿神2017-04-18 10:44:06
ArrayList的泛型E
不是必选的,当未指定泛型的时候,例如:
ArrayList list = new ArrayList();
list.add("test");
list.add(123);
list.add(11.22);
这种情况第二种方法是不适用的,也没办法做强制类型转换