按类型将集合转换为数组

时间:2016-03-21 19:40:40

标签: java arrays collections

我测试了这段代码:

Collection l = new ArrayList<Object>();

l.add(5);
l.add("test");
l.add(6);

Integer[] arr= l.toArray(new Integer[2]);

我试图从这个集合中只获取Integers并获得此异常:

Exception in thread "main" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.Arrays.copyOf(Arrays.java:2248)
    at java.util.ArrayList.toArray(ArrayList.java:389)
    at c.Main.main(Main.java:15)

可能还有其他方法可以过滤,但我需要了解toArray(Object[] a)方法。为什么我不能通过告诉数组的类型和大小来过滤?

3 个答案:

答案 0 :(得分:4)

  

为什么我不能通过告诉数组的类型和大小来过滤?

因为那不是toArray()所做的,并且没有任何地方说它可以用作过滤器。

功能&amp; API有他们所做的定义(有时他们如何)。如果功能不是为了做到这一点,你就不能期望它能做你想做的事。

答案 1 :(得分:4)

toArray尝试将整个集合存储在给定数组中。如果你想过滤它,你必须自己做。 E.g:

Integer[] arr = 
    l.stream().filter(x -> x instanceof Integer).toArray(Integer[]::new);

答案 2 :(得分:2)

请查看该方法的java doc。每个方法按照它向外界声明的合同(根据签名或java doc)工作。

<T> T[] toArray(T[] a); Clearly says in its java doc the below statement.
  

抛出:ArrayStoreException - 如果指定数组的运行时类型不是此集合中每个元素的运行时类型的超类型。

在您的情况下,每个元素的类型不是Integer