【发布时间】:2016-11-30 23:29:46
【问题描述】:
我不明白为什么下面的代码有效:
import java.util.ArrayList;
import java.util.Collection;
public class Main {
public static void main(String[] args) {
Integer[] arr=new Integer[]{1,2,3};
ArrayList<Object> al=new ArrayList<>();
addToCollection(arr, al);
}
static <T> void addToCollection(T[] a, Collection<T> c)
{
for(T o:a)
c.add(o);
}
}
不应该是:
...
static <T> void addToCollection(T[] a, Collection<? super T> c)
...?
在调用过程中类型T不应该一样吗?
正如 cmets 中所说,我的问题是“为 T 推断出哪种类型”。由于代码正常工作,我假设推断层次结构中的“更高”类型。
【问题讨论】:
-
和什么一样?
-
如果你有一个
Bicycle的数组,你不应该把它添加到Vehicle的集合中吗? -
他在问为什么允许他通过
ArrayList<Object>和Integer[]。问题是推断T是哪种类型,我相信它是Object,但目前没有具体提到JLS。 -
arr 是一个 Object[](因为 Integer[] 是一个 Object[]),而 ArrayList
-
请注意,
Object[] x = new Integer[10];可以编译,但ArrayList<Object> l = new ArrayList<Integer>();不能。
标签: java generics collections