泛型 - ArrayList中toArray()为什么不支持强制类型转换?[Java]
黄舟
黄舟 2017-04-18 10:42:06
0
4
616
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(4)
伊谢尔伦

(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[]

伊谢尔伦

StringObject 的子类,但是 String[] 不是 Object[] 的子类,所以对于实际类型是 StringObject 引用是可以强转成 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);

這種情況第二種方法是不適用的,也沒辦法做強制型別轉換

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!