对象的转换,我有三个类
A,B,C
B extends A
c extends A可以把B转换成A   A a = (A)new B();  -----OK;
可以把C转换成A   A a1 = (A)NEW c();  -----ok;但是我用一个ArrayList 里面装两个类D对象d1,d2;
现我取出时返回值为Object为啥必需这样才能访问 D d = (D) new ArrayList().get();这样访问,这样是实现了从Object(父类)强转到子类,而上面的B,C确只能从子类转换到父类,不能从父类转换成子类,为什么会这样;对象转换过程中的转换倒底是啥子意思,遵循什么样的规循;

解决方案 »

  1.   

    D   d   =   (D)   new   ArrayList().get();
    这句话 不要NEW 的 new 是用来声明 和创建的
      

  2.   

    A   a   =   (A)new   B();     -----OK; 
    这个不需要转换,直接用A   a   =   new   B(); 举一个常用的例子:Map map = new HashMap();要将子类对象指向父类对象是需要强制转换如 B b = (B)a;转化的规则就是面向对象的基本概念,必须要有is-a的关系才行
      

  3.   

    B extends A
    C extends A
    B b = (B) new A();
    这句话本身就是错的
    因为只有现有父亲后来才能有儿子
    只有当
    A a = nwe C();
    的时候才能 C c = (C)a
      

  4.   

    D       d       =       (D)       new       ArrayList().get(); 
    这句话   不要NEW   的   new   是用来声明   和创建的这个new 主要是用来创建一个对象,因为没有对象就不能调用其get()方法;
      

  5.   

    A       a       =       (A)new       B();           -----OK;   
    这个不需要转换,直接用A       a       =       new       B();   举一个常用的例子:Map   map   =   new   HashMap(); 要将子类对象指向父类对象是需要强制转换如   B   b   =   (B)a; 转化的规则就是面向对象的基本概念,必须要有is-a的关系才行 
    回2楼,你回答得很好,让我理解得深入了一点,从内存上来说,确实如你所说的,如果  A   a   =   (A)new   B();     -----OK; 这样,是直势接把创建的内象空间直接指向了a,因为B里面有a的构造,所以可以直接赋给a,非常感谢,但是从编译和测试来看,你所说的B b = (B)a,也不用强转,直接B b = a也可以通过,想请你继续解释
      

  6.   

    B b = a -----这是将父对象转成子对象,因为子对象继承了父对象的所有属性,所以这种转化是不需要强转的
    A a = (A)b---这个时候则会造成子对象自己的属性的丢失,所以需要强转。对于Map map = new HashMap();首先Map是借口不是类,而继承和接口实现从某种意义上是相反的,具体的面向对象
    的书上都有讲。可能说得不是很清楚,呵呵
      

  7.   

    刚刚试了一下原来我一直理解反了,不好意思。
    B b  = (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么
    引用就无法正确指向,这时候需要强转。
    不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。
      

  8.   

    强制转换转换是有风险的,如果b的属性比a多,
    且引用a所指向的对象是A类型的,那么如你这么转换: 
    B b = (B)a;
    当引用变量b访问的属性是a没有的,将会出现一个RuntimeException.
      

  9.   

    刚刚试了一下原来我一直理解反了,不好意思。 
    B   b     =   (B)a;其实是将b的引用指向a对象的一个过程,如果b的属性比a多,那么 
    引用就无法正确指向,这时候需要强转。 
    不知道理解的对不对,欢迎指正。感谢大家让我认识了一个一直没注意得错误。回8楼,如果b属性比a多,是不能强转的,因为b里面存放的有a不存在的指向,所以如果你这样强转的话,b中比a多的引用就没有指向了,显然不行,