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

问几个Object转换到String的问题
Java code
class MyList {
    public static void main(String[] args) {
        Object[] o = new Object[]{1, 2, 3};
        String[] s = (String[])o;
        System.out.print(s);
    }
}


这段代码可以通过编译,但是会抛出ClassCastException,这里把Object转化到String哪里不对了?String不是Object的子类吗?

Java code
class MyList {
    public static void main(String[] args) {
        Object o = new Object(1);
        String s = (String)o;
        System.out.print(s);
    }
}


这样写编译器就直接报错了,为什么刚才没报错,这里报了?

Java code
import java.util.*;

class MyList {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("one ");
        list.add("two ");
        list.add("three ");
        String[] sa = new String[3];
        sa = (String[]) list.toArray();
        for (String s : sa)
            System.out.print(s);
    }
}


其实我想问的是这段代码,问题应该和第一个问题一样。





------解决方案--------------------
本题的关键是对对象的理解:这样写是行的: 
Object[] o = new String[]{"1", "2", "3"}; // Object o = new String[]{"1", "2", "3"};也行
String[] s = (String[])o;
System.out.print(s[0]);
为什么是,这不是将Object对象转成String对象。而是其实际对象是Object对象转成String[]数组对象。理解了这一点
 那么本题的下一 sa = (String[]) list.toArray();因为toArray()返回的是一组对象数组。因为内部定义是Object[]
数组。你就是将Object[] 转成String[]这样是不行的。请区分数组对象。与数组对象中无素的对象
------解决方案--------------------
先是第一个问题,没错,String是Object的子类,只能保证String可以向上转型为Object正确,而由String s = (String)o;这是将Object向下转型为String了,这就错了,动物不一定都是老虎,就是这个道理
第二个问题,Object的构造函数不含参数的,你可以参考一下:http://blog.163.com/itworker@126/blog/static/1339832200871042632484/,至于你说的第一个为什么正确,其实第一个你的构造方法本身就有问题,你需要在看一下数组的初始化,还有在第一段程序中,你的System.out.print(s);你也不对的,若想输出,你需要重新定义 toString函数
最后第三个问题,还是关于类型转换的,两个不同的类不要随便就强制转换,虽然他们都是继承自Object类,同上

------解决方案--------------------
探讨
Java codeclass Test {
public static void main(String[] args) {
Object[] o = new String[] { "1", "2", "3" };
String[] s = (String[]) o;
System.out.print(s[0]);
}
}


这么写,运行是没错的。


Java codeclass Test {
public static void main(String[] args) {
Object[] o = new Object[] { "1", "2", "3" };
String[] s = (String[]) o;


------解决方案--------------------
Java code

class MyList {
    public static void main(String[] args) {
        Object[] o = new Object[]{1, 2, 3};
        String[] s = (String[])o;
        System.out.print(s);
    }
}

------解决方案--------------------
Object[] o = new Object[] { "1", "2", "3" }; 这里你其实还是创建了一个Object[],并没有创建String[],虽然你数组里面存储的都是String,但这并没有把你的Object[]从本质上变成一个String[],所以这时试图将Object[]转成String[]是失败的,因为你并没有创建String[],换句话说,内存中其实不存在一个String[]。
而Object[] o = new String[] { "1", "2", "3" }; 这里你是实际创建了一个String[],然后向上转型为Object[],内存中确实是一个String[],所以当你再次向下转型为String[]时可以成功转换。
楼主其实是混淆了“数组的向上转型”和“数组元素的向上转型”两个概念。上面的第一种情况中,只存在数组元素的向上转型,不存在数组的向上转型,所以也就没有相应的向下转型。