请教一个数组类型强制转换的基本问题
[code="java"]
Object[] obj = {"t1","t2"};
String[] str1 = (String[])obj;
System.out.println(str1.length);
[/code]
这段代码能编译,但是运行报错,不能强制转换。为什么?诚心请教!
System.out.println(obj[0].getClass());能得到class java.lang.String
obj中两个类型既然都知道是String为什么不能强制转换,如果数组不能强制转换,为什么编译不报错。
把Object[] obj = {"t1","t2"}; (这个obj类型是java.lang.Object)
用Object[] obj = new String{"t1","t2"};替换是可以运行。
(这样obj类型是java.lang.Object)是不是与这个有关系。
[b]问题补充:[/b]
用Object[] obj = new String{"t1","t2"};替换是可以运行。
(这样obj类型是java.lang.String)是不是与这个有关系。
String是object的子类,在父子关系上,父类的引用是指向一个子类实例则可以通过强制转化将父类引用转化为子类引用,而对于父类的引用能指向一个子类实例是因为java里面的隐含了自动转换,但是引用是指向父类的一个实例而不是一个子类实例的时候,这种向下转换则不能完成,因此运行时报错。
[code="java"]Object[] obj = {"t1","t2"};
String[] str1 = (String[])obj;
System.out.println(str1.length);[/code]
因为对象数组里面可以包括任何对象.
String[] str1 = (String[])obj;
将里面所有的对象都转成了String 就肯定报错了.
Object[] obj = {"t1","t2"};
和
Object[] obj = new String[]{"t1","t2"}
并不是等价的
数组也是对象,所以第一个的类型是Object,第二个的类型是String。如果第二个向下转是可以成功的,第一个就不能成功了。
[quote]用Object[] obj = new String{"t1","t2"};替换是可以运行。
(这样obj类型是java.lang.String)是不是与这个有关系。[/quote]
因为String 的父类是Object.
这肯定可以啊.
或许这么写才容易明白:
Object obj[] = {"t1","t2"};
和
Object obj[] = new String[]{"t1","t2"}
LZ要记住数组本身也是对象,也是有不同类型的。
数组的类型取决于初始化的时候是什么,而不是取决于数组内部装的是什么类型的。
数组的类型确定了之后,数组可以装的对象的大类型就确定了,只能是数组的类型或者其子类型。
所以,第一个数组的类型就是Object,他是不能向下转型为String。
第二个数组的类型是String(虽然申明是Object,但是实际是String),所以他可以向下转型为String类型。