日期:2014-05-20  浏览次数:20603 次

Java中Object数组对象转型泛型对象数组
请问为什么Object类型数组转型为泛型数组运行会报错?
例如:
Object[] o = new String("str","333");
String[] str = (String[])o;
System.out.println(str);//此处运行不报错
Object[] os = new Object[]{new ArrayList<People>(),new ArrayList<People>()};
ArrayList<People>[] als = (ArrayList<People>[])os;
System.out.println(als[0].get(0).getName());//此处运行出错

错误提示:[Ljava.lang.Object; cannot be cast to [Ljava.util.ArrayList;
为什么不能将Object强制转型为ArrayList呢
转型 Java

------解决方案--------------------
如果Foo是Bar的一个子类型(子类或者子接口),而G是某种泛型声明,那么G<Foo>是G<Bar>的子类型并不成立。
------解决方案--------------------
Object是所有类型的基类,对于父子类型转换,如果是单一实例,只要类型一致就可以转换,不会异常。

对于数组是不行的,举个例子:
Parent[] p = new Parent[]{new ChildA(), new ChildB()};

这样定义是可以的,因为p里包含了ChildA/ChildB两个子类对象,如果把p转成子类数组是无法定义类型的。
所以不能把数组转成子类,只能把某个元素转成子类。

你的代码需要这样写:
((ArrayList<People>)os[0]).get(0).getName()