美文网首页
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