看到一个结论:“Java不能创建泛型类型的数组”
并举例:
List<String>[] ls = new ArrayList <String> [10]; //不可以的!
但下面又举例:
List<String>[] ls = new ArrayList [10]; //可以!
然后网上大致都讲了,为什么Java不支持范型数组,
List<String>[] lsa = new List<String>[10]; // Not really allowed.
Object o = lsa;
Object[] oa = (Object[]) o; //oa[0] = o = lsa[]
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[1] = li; // Unsound, but passes run time store check
String s = lsa[1].get(0); // Run-time error: ClassCastException.
然后可以使用:
List<?>[] ls = new ArrayList <?> [10]; //可以!
再用上面那段代码,不过是将String替换成了?,那显然是可以的。
我的问题是:
List<String>[] ls = new ArrayList <String> [10];
不过比List<String>[] ls = new ArrayList [10];
在后面多了个 < String>。
再说了,前面一个< String>已经声明了类型实参,后面一个< String>本来就没什么用处。为什么后面一个支持,而前面这个不支持?而且后面这个不是范型数组么???
(CSDN有问题,《String》半角字符不显示,更新一下问题)
关于楼下2楼都说"new ArrayList [10]",我觉得事实胜于雄辩。输入的时候idea没有报错,上例子:
List<String>[] ls = new ArrayList[3];
List<String> l1 = new ArrayList<>();
l1.add("1");
l1.add("2");
List<String> l2 = new ArrayList<>();
l2.add("a");
l2.add("b");
ls[0] = l1;
ls[1] = l2;
for (int i = 0; i < ls.length; i++) {
System.out.println(ls[i]);
}
输出结果为:
[1, 2]
[a, b]
null