关于java List的强制转型的理解

本文探讨了 Java 中 List 强制转型的误解与正确解释,通过实例展示了转型过程及潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

之前对于涉及到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>();  面向接口

      这篇博客道理很浅显,  可能是我个人理解的误区.很多人可能并无此疑惑.特此记录.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值