我们应该为object.toArray()使用类型转换吗?

Joh*_*nna 7 java arrays list

String[] a = c.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

第一:我需要在这里打字吗?(我想我们应该这样写,(String[])c.toArray();但我已经看到它只是c.toArray()没有使用类型转换.这有效吗?

第二:我们为什么写new String[0]

Jon*_*eet 12

通常只有在使用pre-generics Java时才需要类型转换.如果您查看文档,Collection.toArray(T[])您将看到它知道返回的数组类型与传入的数组类型相同.因此,您可以编写:

List<String> list = new ArrayList<String>();
list.add("Foo");
String[] array = list.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

您传入数组以告诉集合您想要的结果类型,这可能与集合中的类型不同.例如,如果你有一个List<OutputStream>你可能想要将它转换为a Object[],a Stream[]或a 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;
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚注意到这也是在erdemoo的答案中提到的,但是在这里也可以没有受到伤害:)