美文网首页
error: no suitable constructor f

error: no suitable constructor f

作者: callme周小伦 | 来源:发表于2019-10-25 19:49 被阅读0次

    本文知识总结来自于:Java 集合细节(二):asList 的缺陷
    首先贴一下代码:

    public List<Integer> getRow(int rowIndex){
            if (rowIndex == 0)
                return new ArrayList<>();
            int[] resArray = new int[rowIndex];
            for (int i = 0; i < rowIndex; i++) {
                for (int j = 0; j <= i; j++) {
                    if (j == 0 || j == i)
                        resArray[j] = 1;
                    else
                        resArray[j] += resArray[j - 1];
                }
            }
            return new ArrayList<>(Arrays.asList(resArray));
        }
    

    编译器会提示错误:

    image.png
    看到提示会让人很奇怪,为什么类型变成了int[]
    我们看一下asList源码
    public static <T> List<T> asList(T... a) {
            return new ArrayList<>(a);
        }
    

    参数是变长的泛型参数,而基本类型是无法泛型化的,要想作为泛型参数就需要使用其包装类型。 而java中数组是一个对象,是可以泛型话的,因此这里相当于传递了一个参数,参数为int[]数组类型的对象, 我们可以做个实例

    public static void main(String[] args) {
            int[] ints = {1,1,1,1,1};
            List list = Arrays.asList(ints);
            System.out.println(list.size());
            System.out.println("list 的类型:" + list.get(0).getClass());
            System.out.println("list.get(0) == ints:" + list.get(0).equals(ints));
        }
    
    1
    list 的类型:class [I
    list.get(0) == ints:true
    

    而是用Integer时:

    public static void main(String[] args) {
            Integer[] ints = {1,1,1,1,1};
            List list = Arrays.asList(ints);
            System.out.println(list.size());
            System.out.println("list 的类型:" + list.get(0).getClass());
            System.out.println("list.get(0) == ints:" + list.get(0).equals(ints));
        }
    
    5
    list 的类型:class java.lang.Integer
    list.get(0) == ints:false
    

    2. 从上述链接也能看到asList的另一缺陷: asList 产生的列表不可操作

    生成的ArrayList 不是 java.util.ArrayList,他是 Arrays 的内部类。该内部类提供了 size、toArray、get、set、indexOf、contains 方法,而像 add、remove 等改变 list 结果的方法从 AbstractList 父类继承过来,而在抽象类AbstractList 中,add、remove都会抛出异常
    例如:

    public void add(int index, E element) {
            throw new UnsupportedOperationException();
        }
    public E remove(int index) {
            throw new UnsupportedOperationException();
        }
    
    
    
    

    相关文章

      网友评论

          本文标题:error: no suitable constructor f

          本文链接:https://www.haomeiwen.com/subject/tnjevctx.html