码迷,mamicode.com
首页 > 编程语言 > 详细

关于java不支持泛型数组的思考

时间:2020-07-09 00:44:36      阅读:46      评论:0      收藏:0      [点我收藏+]

标签:col   war   fir   数组使用   swa   泛型   detail   创建   sdn   

起因:
今天在看LinkedList源码时,发现

 public <T> T[] toArray(T[] a)方法创建一个泛型数组使用了很奇怪的方式
a = (T[])java.lang.reflect.Array.newInstance(
                                a.getClass().getComponentType(), size)
 
    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            a = (T[])java.lang.reflect.Array.newInstance(
                                a.getClass().getComponentType(), size);
        int i = 0;
        Object[] result = a;
        for (Node<E> x = first; x != null; x = x.next)
            result[i++] = x.item;

        if (a.length > size)
            a[size] = null;

        return a;
    }

 

疑问:为什么不直接使用T[] a = new T[size]来创建泛型数组?

在eclipse测试时,报错

技术图片

 

 

百度上搜索后

Java不能创建泛型数组的解决方案

 

Java不能创建泛型数组 

Java中创建泛型数组

 

总结

java数组时是协变,即Base[] base= new Sub[];Base是Sub的父类

先假设Java可以创建泛型数组,由于java泛型的类型擦除和数组的协变。下面的代码将会编译通过。但是运行时会报错

List<String>[] stringLists=new List<String>[1];
List<Integer> intList = Arrays.asList(40);
Object[] objects = stringLists;
Objects[0]=intList;
String s=stringLists[0].get(0);

 java集合不支持协变,因此出现了泛型

 

 

关于java不支持泛型数组的思考

标签:col   war   fir   数组使用   swa   泛型   detail   创建   sdn   

原文地址:https://www.cnblogs.com/lt123/p/13269971.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!