【问题标题】:Should we use type cast for the object.toArray()?我们应该对 object.toArray() 使用类型转换吗?
【发布时间】:2010-11-06 14:24:51
【问题描述】:
String[] a = c.toArray(new String[0]);

首先:我需要在这里进行类型转换吗? (我认为我们应该写成 (String[])c.toArray(); 但我已经看到它只是 c.toArray() 而不使用类型转换。这有效吗?

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

【问题讨论】:

  • 注意:你也可以使用'c.toArray(new String [] {});'

标签: java arrays list


【解决方案1】:

类型转换通常仅在您使用预泛型 Java 时才需要。如果您查看Collection.toArray(T[]) 的文档,您会发现它知道返回的数组类型与传入的数组类型相同。因此,您可以编写:

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

你传入数组告诉集合你想要什么结果类型,可能和集合中的类型不一样。例如,如果您有 List&lt;OutputStream&gt;,您可能希望将其转换为 Object[]Stream[]ByteArrayOutputStream[] - 显然后者只有在每个元素都实际 是 em>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 的回答中也提到了这一点,但在这里也可以使用它:)

【讨论】:

  • (澄清和更正)。虽然 Johanna 的评论我不太明白 - 你能解释一下你的意思吗?
  • 如果数组的元素多于集合,是不是可以使用new String[0] ??
  • 什么意思?您始终可以使用“new String[0]”,它会为您创建一个适当大小的新数组。
【解决方案2】:

如果您使用 list.toArray(),它将返回您对象数组。 即使存储在列表中的元素是字符串类型,转换为字符串数组也会抛出异常。

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

【讨论】:

    【解决方案3】:
    1. 是的,您需要向下转换,因为 toArray 的返回类型是 Object[]。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 2021-02-24
      • 2010-12-28
      • 2016-01-19
      • 2017-06-13
      • 2014-05-17
      • 2012-02-06
      相关资源
      最近更新 更多