我不明白为什么以下代码有效:
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不应该是相同的吗?
正如评论中所说,我的问题是“为 T 推断哪种类型”。由于代码正在运行,我假设推断出层次结构中的“更高”类型。
最佳答案
arr
和 al
都是 Object 的子类型,所以这就是您所得到的。如果您将 addToCollection
函数更改为具有返回类型,则会发生这种情况:
public static class Main {
public static void main(String[] args) {
Integer[] arr=new Integer[]{1,2,3};
ArrayList<Object> al=new ArrayList<>();
Collection<Object> objects = addToCollection(arr, al); // Compiles
Collection<Integer> numbers = addToCollection(arr, al); // Doesn't compile
}
static <T> Collection<T> addToCollection(T[] a, Collection<T> c)
{
for(T o:a) // Behold the side effect
c.add(o);
return c;
}
}
关于java - addToCollection(T[] a, Collection<T> c) 中的类型 T 不应该相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900147/