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行引发编译错误?
答案 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)作为参数并将它们添加到列表中。