您的位置:首页 > 其它

Arrays.asList()方法的一个有趣现象

2014-10-16 14:02 483 查看
<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中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: