Du939
士弘毅
采纳率0%
2019-09-20 15:19 阅读 2.6k

为什么List< >[] ls = new ArrayList < > []不行,而List<String>[] ls = new ArrayList []可以?

5

看到一个结论:“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
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • wojiushiwo945you 毕小宝 2019-09-20 16:35
    new ArrayList <String> [10]; 
    ```会导致编译器报错“Generic array creation”,可见这是 Java 语法规定的。
    究其根源,跟泛型擦除有关,就是JVM将泛型存储的东西都视为Object,《Java 编程思想》中也着重说明过这种情况。
    泛型数组的底层还是比较的复杂的,具体可以详细看看这篇文章:http://developer.51cto.com/art/201202/317813.htm
    
    点赞 1 评论 复制链接分享
  • qq_36187629 qq_36187629 2019-09-20 15:31

    List[] ls = new ArrayList [10]; //不可以的!

    点赞 评论 复制链接分享

相关推荐