2016-03-21 86 views
1

阵列我测试此代码:转换集合类型来

Collection l = new ArrayList<Object>(); 

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

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

我试图从这个集合只能得到整数和得到这个异常:

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)方法。为什么我不能通过告诉数组的类型和大小来进行过滤?

+4

'toArray'不适用于过滤集合;将一个特定类型的数组传递给'toArray'是一个将_whole_集合复制到该数组的指令。 –

回答

2

请看该方法的java文档。每种方法按照它向外界声明的合同工作(按照签名或java文档)。

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

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

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

4

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

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

函数& API的定义是他们所做的(有时候他们会这样做,如何)。你不能期望一个函数能够做到你想要它做的事情,如果它不是这样做的。

4

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

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

为什么回滚? –

+0

@YassinHajaj编辑不会提高代码的可读性 – Mureinik

+0

它确实改善了很多。 –