请阅读问题而不是假设这是重复的。
在我正在处理的代码库中,我有一个Foo对象列表:
private List<Foo> fooList;
有人可以向我解释一下这行代码之间的区别:
Foo foos[] = fooList.toArray(new Foo[fooList.size()]);
和这条线?
Foo foos[] = (Foo[]) fooList.toArray();
答案 0 :(得分:6)
不同的是,第二个会在运行时抛出ClassCastException
。无参数List#toArray()
方法在内部创建Object[]
,您无法将其转换为Foo[]
。由于通用类型信息被编译器擦除,因此在运行时不知道列表的类型。因此,您无法知道创建数组的实际类型(即,您无法创建类似 - new T[size]
的数组)。这就是它创建Object[]
。
要解决此问题,可以使用通用方法List#toArray(T[])
,您可以在其中传递实际数组,该数组将由ArrayList
的元素填充。如果数组的大小不足以适合元素,则会在内部创建一个新数组。因此,由于您传递了new Foo[fooList.size()]
,它将被列表中的元素填充。但是,如果您传递了new Foo[0]
,则会创建一个新数组。
答案 1 :(得分:1)
第二种方法是错误的。
fooList.toArray();
的类型是Object []
键入第一种方法。您创建了具有正确类型和大小(new Foo[fooList.size()]
)的新数组,然后使用fooList.toArray()
此外,您可以使用fooList.toArray(new Foo[0])
,但这会为您提供额外的空数组对象。
toArray很简单。如果你不带参数调用它,就会创建新的Object []。
如果给出一个类型正确的数组,它会尝试填充它,如果它有足够的空间,或者丢弃它,并创建给定类型的新数组。
答案 2 :(得分:1)
如果您要问下面方法之间的区别;
list.toArray(array);
list.toArray();
第一种方法将尝试将列表中的元素放入给定的array
实例中,如果失败则创建一个新数组并继续。返回数组的运行时类型也是指定数组的运行时类型。
第二个方法创建一个新数组并继续,返回类型为Object[]
,在您的示例中导致类强制转换异常。
答案 3 :(得分:-1)
Using asList()
方法
List<String> list = Arrays.asList(array);
转到以下链接: http://javaxtutorials.blogspot.in/p/converting-array-as-list-and-list-to.html