数组与泛型(1)

  通常,数组和泛型不能很好地结合

1  可以创建泛型数组的引用

2 不能实例化具有参数化类型的数组

3 可以参数化数组本身的类型

4 可以创建非泛型的数组,然后转型

package example;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
    
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        List<String>[] ls;
    //    ls = new List<String>[10];  //Cannot create a generic array of List<String>
        
        List[] list = new List[10];
        //不可以定义,但是可以类型转换
        ls = (List<String>[])list;   //    @SuppressWarnings("unchecked")
        
        Object[] objs = ls;  
        objs[0] = new ArrayList<String>();
        
        String[] strs;
        try {
            //编译通过,运行时报异常
            strs = arrayOfGenericType(10);  //java.lang.ClassCastException:
        } catch(Exception e) {
            System.out.println(e);
        }
        
        //此处运行正常
        strs = arrayOfGenericType(String.class, 4);
        System.out.println(Arrays.toString(strs));
    }
    
    @SuppressWarnings("unchecked")
    public static <T> T[] arrayOfGenericType(int s) {
        //此处必须强制转型,实际创建的是Object类型的数组
        return (T[]) new Object[s];  //    @SuppressWarnings("unchecked")
    }
    
    @SuppressWarnings("unchecked")
    public static <T> T[] arrayOfGenericType(Class<T> kind, int s) {
        //此处必须强制转型,实际创建的是kind类型的数组
        return (T[]) Array.newInstance(kind, s);  //    @SuppressWarnings("unchecked")
    }
}

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
[null, null, null, null]

原文地址:https://www.cnblogs.com/xurui1995/p/5339149.html