通常,数组和泛型不能很好地结合
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]