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

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

	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型的数组
 
 
 

 

 

 

   

  

你可能感兴趣的:(toArray)