java - addToCollection(T[] a, Collection<T> c) 中的类型 T 不应该相同吗?

标签 java generics collections

我不明白为什么以下代码有效:

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 推断哪种类型”。由于代码正在运行,我假设推断出层次结构中的“更高”类型。

最佳答案

arral 都是 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/

相关文章:

c# - 从通用列表底部删除重复项

Java 收集器按动态字段分组

java - 如何检查泛型类型是否在java中实现了特定类型的泛型接口(interface)?

java - 如何显式调用父类的构造函数

java - AWT EventQqueue AccessControlException

c# - 我怎样才能一般地包含仅限于某个类的实体的属性?

arrays - 将多个返回函数分配给容器(列表)

Java ConcurrentHashMap 和同步

java - 从 Java 子类获取值

c# - 将实现转换为具有泛型类型的接口(interface)