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中
相关文章推荐
- 【Java基础】一个有意思的泛型方法Arrays.asList(T... a)
- 阿里巴巴 Java 开发手册:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法
- Java利用Arrays的asList方法输出数组数据
- Arrays类——Arrays.asList()方法使用
- Java初学习 - Arrays.asList方法总结
- Arrays.asList方法总结
- 为什么Java里的Arrays.asList不能用add和remove方法?
- Java利用Arrays的asList方法输出数组数据
- Arrays类——Arrays.asList()方法使用
- Arrays.asList(param)方法中param的不同,方法的返回值不同的实例分析
- Arrays类——Arrays.asList()方法使用
- Java利用Arrays的asList方法输出数组数据
- Arrays.asList()方法使用
- Arrays.asList方法总结
- Arrays.asList方法总结
- Arrays.asList(array)将返回一个List,然而这个返回的List并不支持add和remove的操作
- arrays.aslist() 方法 java.lang.UnsupportedOperationException
- 扩展方法的一个有趣现象
- Arrays.asList方法总结
- Arrays.asList()方法源码解析