做了一道笔试题,回来验证结果的时候发现里面有个陷阱,找了一下才发现Arrays.asList
这个方法有坑
asList的定义如下
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
这个T必须是对象类型。好比我们不能new ArrayList 只能new ArrayList
如果是基本类型 char ,int ,long,double,float,会直接当成一个对象
T… arr 的声明等效于T[] arr的声明,编译器会在caller传入的地方初始化出一个数组,将所有的变参加进数组,然后穿给callee。
范型只针对引用类型,范型T如果不通过extends指定父类型,默认就是Object类型,所以这个方法的字节码签名其实是:
([Ljava/lang/Object;)Ljava/util/List;
当primitive类型以列举的方式传入时,如
Arrays.asList(1, 2, 3)
由于这些int型参数不是引用类型,会触发编译器对每一个变参做autoboxing,生成Integer类型的数组,传入到asList
而当int类型数组传入时,数组已经是一个引用类型(类型为[I )了,autoboxing无需再起作用,直接就把数组作为一个Object传给asList方法了。