2009-06-29 31 views
7
String[] a = c.toArray(new String[0]); 

第一:我需要在这里输入吗? (我觉得我们应该写出这样(String[])c.toArray();但我已经看到了刚刚c.toArray()不使用类型转换这是有效我们应该使用object.toArray()类型转换吗?

二:?也是为什么我们写new String[0]

+0

取决于c的类型。 – gimel 2009-06-29 05:33:57

+0

注意:你也可以使用'c.toArray(new String [] {});' – 2009-06-29 14:46:25

回答

12

类型转换通常只在您使用预泛型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[] - 显然后者仅在每个元素实际上为 a 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
  1. 是你需要自垂头丧气?指定者的返回类型是Object []。

  2. 你需要通过(新的String [0])的,因为该方法的参数需要知道它应该返回什么类型的数组(字符串,日期等的阵列)在内部,所有列表元素实际上都是对象,因此列表不知道它所保存的元素的类型因此它不知道应该返回哪种数组,除非将它作为参数提供。

+1

不错,但我认为我们需要在这里上传! – Johanna 2009-06-29 05:45:14

4

如果你正在使用list.toArray(),这将返回对象数组。 即使存储在列表中的元素是字符串类型,投射到字符串数组也会抛出异常。

如果您使用list.toArray(Object [] a),它会将列表中的元素存储到“a”数组中。如果列表中的元素是String并且给了String数组,那么它会将元素存储在String数组中,如果给定数组的大小不足以将元素存储在列表中,则它将展开给定列表。

相关问题