士弘毅 2019-09-20 15:19 采纳率: 0%
浏览 3120
已结题

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

看到一个结论:“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条回答

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

报告相同问题?

悬赏问题

  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器