<span style="font-family: Arial, Helvetica, sans-serif;">//几个测试用的类,thinking in java 4th edition , chapter 11 ,page 221</span>
Class A{}
Class B extends A{}
Class C extends A{}
Class D extends A{}
Class E extends B{}
Class F extends B{}
List<A> a1=Arrays.asList(new B(),new C(),new D());
List<A> a2=Arrays.asList(new E(),new F());
List<A> a3=Arrays.asList(new B(),new B());
Arrays.asList的方法实现为:
public static <T> List<T> asList(T... array) {
return new ArrayList<T>(array);
}
其中,a1语句执行成功,a2,a3语句执行失败,原因如下。
a1执行时,asList方法会将参数列表中的参数解析,然后返回一个ArrayList.
由于B,C,D是3个不同的类,且共同继承于A,所以编译器会认为B,C,D是A的子类,那么为了兼容这3个类,会使用泛型
所以返回的arrayList是A类型的.
a2执行时,由于E,F是继承于B的,同理,为了兼容这两个类,返回的ArrayList是B类型的(编译器不会认为因为B继承于A就返回A类型的)
虽然B是A的子类,但是由于ListArray<A>与ListArray<B>类型不同,所以不能进行赋值操作.
a3执行时,由于参数列表中的两个参数均为B,所以同2,返回类型为ListArray<B>
如果将方法修改如下,则可以正确执行
List<A> a=new ArrayList<A>;
Collections.addAll(A,new E(),new F())
List<A>=Arrays.<A>asList(new C(),new D());
第一种方法中
由于声明了ArrayList中的对象是A类型的,E,F继承于A,所以可以正常执行
第二种方法中
Arrays.<A>asList中通过<A>这一参数确定了ArrayList的类型,所以也可以正常执行.
所以,综上所述.
Arrays.asList所进行的操作主要有两个
1:确定返回的ArrayList的类型,要注意继承时候的关系等.
2.将参数列表中的对象添加到ArrayList中