为什么List <string>接受另一个<list>作为元素</list> </string>

时间:2011-05-11 14:55:07

标签: java generics

import java.lang.Math;
import java.util.*;
import java.io.*;


class Hello {


    public static void main(String args[]) throws FileNotFoundException{

        String[] veri2 = {"No", "Compilation", "Error"};

        List<String> veri1 = new ArrayList<String>();
        veri1.addAll(Arrays.asList(veri2)); // ---------- 14
        System.out.println(veri1+"elements in hashset");

    } 

}

为什么在将List添加到其元素类型为String的另一个List时,上面的代码不会在第14行引发编译错误?

8 个答案:

答案 0 :(得分:8)

List<E>.addAll方法接受Collection<? extends E>List<E>接口继承自Collection<E>

如果尝试使用String添加addAll,您实际上会收到错误。

List<String> list = new ArrayList<String>();
list.addAll("Hello");

上述代码不起作用,因为String未实现Collection<String>

答案 1 :(得分:3)

您的案例中的签名为addAll(Collection<String> c),因为您传递的List<String>一直延伸Collection<String>一切正常。

答案 2 :(得分:1)

Arrays.asList()是通用的,因为您的数组是String的数组,它会返回List<String>,这正是您想要的。

请参阅:http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...)

答案 3 :(得分:1)

为什么会出现编译错误? addAll()的签名是:

boolean addAll(Collection<? extends E> c)

所以在你的情况下:

boolean addAll(Collection<? extends String> c)

和Arrays.asList():

public static <T> List<T> asList(T... a)

这意味着你的

public static List<String> asList(String... a)

所以addAll()需要Collection<? extends String>并获得List<String> - 这完全没问题。

答案 4 :(得分:1)

因为Arrays.asList()返回一个List。在你的情况下,它解释你的String []并将其设置为类型。

答案 5 :(得分:0)

添加List&lt; String&gt;的所有元素时到列表&lt; String&gt;这是有一次你不应该得到错误。

答案 6 :(得分:0)

因为addAll会将集合的每个元素添加到列表中。如果您已经调用了add,那么您可能会遇到预期的错误。

答案 7 :(得分:0)

正如您在List API中所看到的那样:

public boolean addAll(Collection c)

将指定集合中的所有元素追加到此列表的末尾...

因此没有类型错误,因为addAll接收Collection(List是一个Collection)作为参数并将它们添加到列表中。