将ArrayList<String>转换为String[]

5

1) 我想知道为什么我不能这样做:

ArrayList<String> entries = new ArrayList<String>();
entries.add("entry");
String[] myentries = (String[])entries.toArray();

这有什么问题吗?(你可以忽略第二行代码,它与问题无关)

2)我知道可以使用这段代码实现我的目标:

ArrayList<String> entries = new ArrayList<String>();
entries.add("entry");
String[] myentries = new String[entries.size()];
myentries = entries.toArray(myentries)

这是将ArrayList转换为String数组的首选方法吗?有更好/更短的方法吗?
非常感谢 :-)
4个回答

13

第一个示例返回一个Object[],因为列表不知道您想要什么类型的数组,因此无法将其转换为String[]

您可以使用以下方式使第二个示例稍微缩短

String[] myentries = entries.toArray(new String[entries.size()]);

1
谢谢大家的回复,它们都很有帮助。我发现这个答案的措辞比其他答案更清晰一些。对于存档的小提醒:你可以从子类向超类进行强制类型转换,但反过来不行。由于Object是String的超类,因此您可以将String转换为Object,但反过来不行。这是如此基础的东西,如果您不使用它,就会忘记它;-) - stefan.at.kotlin

3

ArrayList创建的后备数组不是String数组,而是Object数组,这就是为什么你不能强制转换它的原因。

关于第二种情况。这是将其转换为数组的常见方法,但你可以通过编写以下代码使其更简洁:

String[] myentries = entries.toArray(new String[entries.size()]);

2
List<String> list = ...;
String[] array = list.toArray(new String[list.size()]);

0

类型条目丢失了(因为在Java中泛型被擦除)。因此,当您进行toArray调用时,它只能返回Object类型,因为它知道List必须包含对象。因此,您可以获得一个包含字符串的Object[]。如果您想要一个字符串数组,则需要将其传递给toArray方法。使用强制转换无法缩小数组引用,即无法将对象数组转换为字符串数组。但是,您可以反过来做,因为它们是协变的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接