泛型和Varargs

时间:2014-07-15 19:27:12

标签: java generics variadic-functions

在课堂上,我们创建了两个相同的方法,这些方法仅在参数方面有所不同:

public class Lists {
    public static <T> List<T> toListArray(T[] arr){
        List<T> list = new ArrayList<T>();
        for (T elt : arr)
            list.add(elt);
        return list;
    }

    public static <T> List<T> toListVarargs(T... arr){
        List<T> list = new ArrayList<T>();
        for (T elt : arr)
            list.add(elt);
        return list;
    }
    public static void main(String[] args) {
        List<Object> list = Lists.<Object>toListVarargs(1, "two");
        list = Lists.<Object>toListVarargs();
        list = Lists.<Object>toListArray(1,"two");//<---Does not compile
        list = Lists.<Object>toListArray();//<---Does not compile
    }
}

为什么主编译中的前两个字符串和后两个字符串没有?

3 个答案:

答案 0 :(得分:2)

因为toListArray需要一个数组作为参数。

答案 1 :(得分:2)

以下内容无法编译:

list = Lists.<Object>toListArray(1,"two");//<---Not compiles
list = Lists.<Object>toListArray();//<---Not compiles

因为toListArray()需要 正好一个 参数(并且它必须是一个数组)。你试图传递0或2个参数,因此错误(只有varargs允许任意数量的参数)

答案 2 :(得分:1)

最后两个不能编译,因为编译器需要一个数组作为方法的输入参数(toListArray)。相比之下,toListVarargs基于varargs,因此它可以采用任何类型的零个,一个或多个参数(因为您使用了Object类型)。