由List 的toArray()引起的对Object[]转换成String[]数组的思考

本文详细解析了Java中List转换为String数组时遇到ClassCastException的原因,通过实例演示了如何正确进行转换,并深入探讨了数组与List类型的差异及转换规则。

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

  一次在项目中写了如下代码,编译通过,运行时却报错 

	public void testToArray(){
		List<String> names = new ArrayList<String>();
		names.add("JAY");
	        String[] nameArray = (String[])names.toArray();
	}

   出错信息:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
	at yong.li.mianshi.ToArray_Test.main(ToArray_Test.java:105)
   当时觉得不可思议:代码里names明明是List<String>类型的,所以names.toArray()返回的Object[]理所应
当是String[]向上转型得到的,所以(String[])names.toArray()打死都不应该报错。但事后我发现我有点想当然
了,红色标注的话是我自己想太多了,其实:
  Object[] nameObjArray = names.toArray();
  测试nameObjArray能不能向下转型成String[],最简单粗暴的方法就是用instanceof
if(!nameObjArray instanceof String[]){
  System.out.println("不可以转,你有点想多了!");
}else{
  System.out.println("可以转!");
}
 程序运行进入到if的第一个分支中去,所以不能拿toArray()返回的结果直接强转成String[].原因就是list的
toArray()返回的Object[]类型的结果并不是由String[]向上转型或类似的做法得到。但不能就由此下结论,认
为Objecgt[] 不能强转成String[],例如:
String[] names = {"JAY"};
Object nameObjArray = (Object[])names;
这个时候nameObjArray就可以直接强转回到它原来的String[]类型了。
从某个角度来说,数组也是对象,数组类型的转换,跟一般的对象类型的转换是一样的。Object[] 的类型
是:[Ljava.lang.Object ,而String[]的类型是 [Ljava.lang.String,如果一个[Ljava.lang.Object 类型的实例并
不指向[Ljava.lang.String类型的对象,强转肯定报错,这与Object与String的关系是一样的:Object obj =
new Object; String str = (String)obj,肯定要报错!
我今天才知道String型数组的类型是用“[Ljava.lang.String”,数组类型的表示:
   a." [ "表示一维数组,"[[ "二维数组
   b. "L"代表这个数组是引用数据类型的数组. "java.lang.String"是数组元素的类型,标识这个数组是什么类型
的数组.基本数据类型的每种类型都有自已对应的标识符,如int[] 的类型是"[I"表示它是int型的数组
 
 
 

 

 

 

   

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值