背景:
之前对于涉及到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>(); 面向接口
这篇博客道理很浅显, 可能是我个人理解的误区.很多人可能并无此疑惑.特此记录.