Java里的Arrays.asList
2015-12-18 13:58
435 查看
参考资料:
Java编程思想
Arrays是一个工具类,没有实现任何其它接口,也没有继承除
我们看下下面这个例子
结论: Arrays.asList返回的是可变参数中的所有对象的最低层次的公共父类的对象.
先看 1.
再看下2.
不过这里有个疑问,
当把2.中代码换成(使用通配符):
或者显示类型参数说明以告诉编译器对于由
这样便可以了
再来看下5.
Java编程思想
Arrays是一个工具类,没有实现任何其它接口,也没有继承除
Object之外的任何类。其作用是将泛型可变参数转换成一个固定长度的
List对象,在Java编程思想中这样描述到:”Arrays.asList()方法的限制是它对所产生的List的类型做出了最理想的假设,而并没有注意你对它会赋予什么样的类型”
我们看下下面这个例子
class Snow{} class Powder extends Snow{} class Crusty extends Snow{} class Slush extends Snow{} class Light extends Powder{} class Heavy extends Powder{} public class AsListInference { /** * @param args */ public static void main(String[] args) { //1. 没有报错 List<Snow> list1=Arrays.asList(new Powder(),new Crusty()); //2. 编译时期错误: Type mismatch: cannot convert from List<Powder> to List<Snow> List<Snow> list2=Arrays.asList(new Powder(),new Light()); //3. 编译时期错误: Type mismatch: cannot convert from List<Powder> to List<Snow> List<Snow> list3=Arrays.asList(new Light(),new Heavy()); //4. 不报错 List<Snow> list4=Arrays.asList(new Crusty(),new Slush(),new Powder(),new Light(),new Heavy()); //5. 不报错 List<Snow> list5=Arrays.asList(new Crusty(),new Light()); } }
结论: Arrays.asList返回的是可变参数中的所有对象的最低层次的公共父类的对象.
先看 1.
Powder类与
Crusty类均继承
Snow类,即它们两最低层次的公共父类为
Snow类,当然最高层次公共父类为
Object类,因此1中
Arrays.asList获得的即为一个
List<Snow>,因此不会报错
再看下2.
Light类继承
Powder类,因此
Light与
Powder类二者的最低层次的公共父类为
Powder类,此时
Arrays.asList获得的则是一个
List<Powder>,将它赋值给一个
List<Snow>便报错。
不过这里有个疑问,
Powder类不是继承了
Snow类,赋值时不能自动向上转型吗?
当把2.中代码换成(使用通配符):
List<? extends Snow> list2=Arrays.asList(new Powder(),new Light());
或者显示类型参数说明以告诉编译器对于由
Arrays.asList产生的
List类型,实际的目标类型应该是什么
List<Snow> list2=Arrays.<Snow>asList(new Powder(),new Light());
这样便可以了
再来看下5.
Crusty类继承
Snow类,
Light类继承
Powder类,
Powder类继承
Snow类,因为
Crusty类与
Light类的最低层次的公共父类为
Snow类,因此
Arrays.asList获得为
List<Snow>,因此也就不会报错。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树