【问题标题】: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<capture#2-of ?> 类型中的方法 add(int, capture#2-of ?) 不适用于参数 (int)。
我也尝试过这种方式,但给了我同样的错误
ArrayList<?> numberList = new ArrayList<Number>();
numberList = new ArrayList<Integer>();
numberList.add(100);
错误是:
ArrayList<capture#2-of ?> 类型中的方法 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;