您的位置:首页 > 编程语言 > Java开发

关于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>(); 面向接口

这篇博客道理很浅显, 可能是我个人理解的误区.很多人可能并无此疑惑.特此记录.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: