java - 在Java源代码中,为什么 ArrayList.add 有参数作为泛型类型 T 而 addAll 有参数作为泛型类型?
问题描述
这是Java的源代码ArrayList
(使用java 1.8)
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
我不太清楚为什么我们只能使用E
foradd()
而我们可以使用<? extends E>
foraddAll()
解决方案
因为如果你有一个ArrayList<Number>
你可以add
aInteger
和 aNumber
和 aDouble
因为它们都是E
/的子类型,Number
但你不能addAll
a ArrayList<Integer>
if 签名是addAll(Collection<E> c)
因为 anArrayList<Integer>
不是 (subtype of)ArrayList<Number>
因为在 Java 中泛型是不变的。只有将其定义为addAll(Collection<? extends E> c)
可以添加具有更具体的通用子类型的列表。这基本上意味着“任何具有作为子类型的泛型参数的集合E
”
推荐阅读
- c# - Azure AD 上传服务主体密钥凭据证书
- c# - 如何通过 MS 图表创建状态图表
- visual-studio - Blazor 代码语法背景颜色突出显示 Visual Studio
- c# - 创建动态按钮 C#
- android - 在 Odoo 移动框架中具有 odoo 功能的 OColumn 不起作用
- python - KERAS CUSTOM LOSS 中的错误“TypeError:传递给参数 'reduction_indices' 的值的 DataType float32 不在允许值列表中:int32,int64”
- python - 如何管理华为GSM调制解调器的音频进出文件?
- angular - 如何创建基于模型类的响应?
- java - Java根据优先级执行方法SYNC/ASYNC
- lisp - lisp 将值传递给函数?