String[] a = c.toArray(new String[0]);
首先:我需要在这里输入类型吗? (我认为我们应该像(String[])c.toArray();
那样写,但我没有使用类型转换,我只看到c.toArray()
。这有效吗?
第二:我们为什么写new String[0]
?
答案 0 :(得分:12)
通常只有在使用pre-generics Java时才需要使用类型转换。如果你查看Collection.toArray(T[])
的文档,你会发现它知道返回的数组的类型与传入的数组的类型相同。所以,你可以写:
List<String> list = new ArrayList<String>();
list.add("Foo");
String[] array = list.toArray(new String[0]);
传入数组以告诉集合您想要的结果类型,这可能与集合中的类型不同。例如,如果您有List<OutputStream>
,则可能需要将其转换为Object[]
,Stream[]
或ByteArrayOutputStream[]
- 显然后者只会在元素 是ByteArrayOutputStream
。这也意味着如果您已经拥有了正确类型和大小的数组,则可以将内容复制到该数组中,而不是创建新数组。
顺便提一下,此答案的先前版本不准确 - 如果您使用不带任何参数的重载,则总是返回Object[]
,但不能投下:
List<String> list = new ArrayList<String>();
list.add("Foo");
// toArray doesn't know the type of array to create
// due to type erasure
Object[] array = list.toArray();
// This cast will fail at execution time
String[] stringArray = (String[]) arrray;
编辑:我刚刚注意到在erdemoo的回答中也提到过这个问题,但是在这里也可以这样做:)
答案 1 :(得分:4)
如果您使用list.toArray(),它将返回Object数组。 即使存储在list中的元素是String类型,Casting to String数组也会抛出异常。
如果您使用list.toArray(Object [] a),它会将列表中的元素存储到“a”数组中。如果列表中的元素是String并且你给String数组然后它将元素存储在String数组中,如果给定的数组不足以在列表中存储元素,那么它将扩展给定列表。
答案 2 :(得分:1)
是的,你需要向下转换,因为toArray的返回类型是Object []。
您需要传递(new String [0])作为参数,因为该方法需要知道它应该返回什么类型的数组(字符串数组,日期等)。内部所有列表元素实际上都是对象所以列表不知道它所持有的元素的类型,因此它不知道它应该返回哪种数组,除非你将它作为参数提供。