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

时间:2016-11-30 23:29:47

标签: 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的哪种类型”。由于代码正常,我假设层次结构中的“更高”类型是推断的。

1 个答案:

答案 0 :(得分:2)

arral都是对象的子类型,因此您可以获得所需的内容。如果您将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;
    }
}