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

<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中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值