一个Stream类型转换异常

纯属犯蠢,可以看一看,没有什么可以学到的东西

在分析Stream的时候写的测试代码出现了异常,那为什么Arrays.asList会出现ClassCastException?

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
int[] ints=new int[]{1,2,3,4,5,6,7,8,9,10};
List lists=Arrays.asList(ints);
Optional anInt=lists.stream().filter(
a->{
return (int)a >100;
}
).max(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
return Integer.compare((int)o1,(int)o2);
}
}
);
}

执行结果

执行结果为 Exception in thread “main” java.lang.ClassCastException: [I cannot be cast to java.lang.Integer

开始分析

看一下asList方法做了些什么,首先他构建了一个内部的ArrayList

1
2
3
4
5
// Arrays.java
public static <T> List<T> asList(T... a) {
// 这里是内部类,不是平时用的ArrayList
return new ArrayList<>(a);
}

再来看这个内部类是如何构造的

1
2
3
4
5
6
//Arrays.ArrayList.java
private final E[] a;

ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}

为什么asList的参数是一个不定参。。。难道。。。

打开断点进行Debug,果然lists的实际size为1,包含了一个int[]数组,其实这个方法并不是把数组转换为集合而是把所有参数放到一个集合中。