关于java List的强制转型的理解
2016-05-18 11:01
381 查看
背景:
之前对于涉及到List的强制转型的理解是: List<Person> personList = (List<Person>) list; 他会检测list中的每一项,如果其中包括非Person类或其子类的就会提示错误.然而这个想法并不正确.
测试:
两个简单无关系的类.public class Cat { private String name; public Cat(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Person { private String name; public Person(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
测试代码:
public class TestCastList { public static void main(String[] args) { List list = new ArrayList<Object>(); list.add(new Person("小红")); list.add(new Person("小红2")); list.add(new Person("小红3")); list.add(new Person("小红4")); list.add(new Cat("小花")); list.add(new Cat("小花2")); list.add(new Cat("小花3")); List<Person> personList = (List<Person>) list; for (Object object : personList) { System.err.println(object); } } }
结果:
wei.learn.javaBasic.list.Person@139a55
wei.learn.javaBasic.list.Person@1db9742
wei.learn.javaBasic.list.Person@106d69c
wei.learn.javaBasic.list.Person@52e922
wei.learn.javaBasic.list.Cat@25154f
wei.learn.javaBasic.list.Cat@10dea4e
wei.learn.javaBasic.list.Cat@647e05
结论:
按照我之前的假设,强转判断会出错,并不可能执行.更为正确的理解是:
1.List的强转是否可以执行取决于声明时的类型和强转的目标类型. 声明时是List 并为设置泛型 所以强转可以进行,但给出了警告提示.
2.list可以添加什么对象取决于声明的类型.
综上 这段逻辑可以正确执行.
PS: 如果personList中的cat对象涉及到了向Person的强转会在运行时出现错误,所以这种编程存在很强的迷惑性.建议不要使用.
改进在声明最初的list时,提供泛型约束 例如 List<IAnimal> list = new ArrayList<IAnimal>(); 面向接口
这篇博客道理很浅显, 可能是我个人理解的误区.很多人可能并无此疑惑.特此记录.
相关文章推荐
- java工程生成jar
- Spring常用注解,自动扫描装配Bean
- java 属性文件的读取操作
- java之高级for循环
- 个人学习-java-set的实现
- java 文件夹中创建文件夹
- spring remoting源码分析--Hessian分析
- java中的matches()方法
- Java多线程中提到的原子性和可见性、有序性
- Spring中切面的<aop:advisor pointcut="execution参数解析
- Java线程:概念与原理
- Java技术核心卷I学习笔记——继承
- java常见异常汇总
- JAVA中获取当前系统时间
- Java NIO概述
- java date
- struts2 标签s:select在table中单行显示
- 【Java语言】嵌套For循环性能优化案例
- RxJava笔记
- Java中Properties类的操作