【问题标题】:How to add an integer element to ArrayList of wildcards in Generics?如何在泛型中将整数元素添加到通配符的 ArrayList?
【发布时间】:2016-12-14 03:55:23
【问题描述】:

我有一个 ArrayList 通用通配符类型,它将 Number 作为扩展。我正在尝试将整数值添加到 ArrayList。

但它给了我一个错误的说法

ArrayList<? extends Number> numberList = new ArrayList<Number>();
    numberList = new ArrayList<Integer>();
    numberList.add(100);

ArrayList&lt;capture#2-of ?&gt; 类型中的方法 add(int, capture#2-of ?) 不适用于参数 (int)。

我也尝试过这种方式,但给了我同样的错误

ArrayList<?> numberList = new ArrayList<Number>();
    numberList = new ArrayList<Integer>();
    numberList.add(100);

错误是:

ArrayList&lt;capture#2-of ?&gt; 类型中的方法 add(int, capture#2-of ?) 不适用于参数 (int)

【问题讨论】:

标签: java generics arraylist integer


【解决方案1】:

你不能。 ? extends 部分基本上告诉编译器:它属于某种类型,我不知道,但它扩展了 Number。

因此编译器无法保证您要添加的任何类型与未知类型兼容。因此,您不能向此类集合添加任何内容。

【讨论】:

    【解决方案2】:

    您不能将 Integer 添加到列表中,因为它可能是 Float 列表,而不是 Integer 列表。

    你可以这样做:

    ArrayList<? super Number> numberList = new ArrayList();
    numberList.add(100);
    

    或者只是

    ArrayList<Number> numberList = new ArrayList();
    numberList.add(100);
    

    【讨论】:

      【解决方案3】:

      你可以使用;

       ArrayList <?  super Number> numberList = new ArrayList<Number>();
       Number number = 1;
       numberList.add(number);
      
       or
      
       numberList.add(1);
      

      【讨论】:

        【解决方案4】:

        你应该这样做

        ArrayList<? super Number> numberList = new ArrayList<Number>();
        numberList.add(100);
        

        对于java 8,你可以使用stream(),

        // to resolve your read problem cause by  <? super>
        
        ArrayList<? super Number> arrayList = new ArrayList<Number>();
        arrayList.add(100);
        List<Integer> list = arrayList.stream().map(e->(Integer) e).collect(Collectors.toList());
        System.out.println(list);
        

        【讨论】:

          【解决方案5】:

          一种可能的解决方法:

          List<? extends Number> numberList = new ArrayList<Number>();
          List<Integer> integerList = new ArrayList<>():
          integerList.add(100);
          numberList = integerList;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-30
            • 1970-01-01
            • 1970-01-01
            • 2010-09-15
            • 1970-01-01
            • 1970-01-01
            • 2012-12-27
            相关资源
            最近更新 更多