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

标签 java arrays list

String[] a = c.toArray(new String[0]);

首先:我需要在这里进行类型转换吗? (我认为我们应该这样写这有效吗?

第二:还有为什么要写new String[0]

最佳答案

通常只有在使用前泛型 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 的回答中也提到了这一点,但在这里也没有坏处:)

关于java - 我们应该为 object.toArray() 使用类型转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1056683/

相关文章:

java - 如何使用整数数组进行间距计数来形成垂直字符串图案?

java - 带工具栏的 Android 抽屉式菜单

javascript - 使用 vanilla JS 删除 ES5 及以下版本数组中的重复数字的最快方法是什么?

java - 无法弄清楚正则表达式问题

使用 foreach 循环遍历数组两次并通过引用传递值的 php 问题

c# - 如何有效地交叉引用 2 个文本文件? |改进我的代码

c# - 当它减少和增加时分隔列表中的值

java - java中如何在字符列表中添加值并在下一个值为空时停止添加

java - Liquibase 每次都运行变更集

java - hibernate :无法从数据库获取建议的身份策略列表。可能是 JDBC 驱动程序问题