Myjava.java   
  class   A   
  {   
  public   void   func1()   
  {   
  System.out.println("A.func1");   
  }     
  }   
  class   B   extends   A   
  {   
  public   void   func1()   
  {   
  System.out.println("B.func1");   
  }   
 }   
  class   C   
  {   
  public   static   void   main(String[]   args)           
  {   
          System.out.println("强制类型转换A->B后的调用效果:");   
          A   a   =   new   A();   
          B   b   =   (B)a;   
          b.func1();   
  }   
  }   
调试的时候 会报一个异常,无法转换。我在网上查阅了很多资料,都说父类无法强制转换为子类。但是在Structs里面ActionFrom为什么可以转换为子类,它是如何做到的呢,恳请高手解惑,谢谢啦。

解决方案 »

  1.   

     A a = new B();   
      B b = (B)a; 
    这样就可以。
      

  2.   

    父类无法转换成子类。
       Structs里面的ActionFrom是用配置文件和对应的后台类转换的。
      

  3.   

    儿子肯定有老爸的一些继承的东东,但儿子的一些自己的东东老爸可没有噢。比如老爸有老婆a,儿子就一定有老妈a,但儿子结婚了,又有了老婆b。你要把老爸强制变为儿子,那这个老爸就要去变个老婆b来,而且得跟儿子的老婆b一摸一样,不行吧而儿子强制变为老爸,就简单,离婚啊,把老婆b丢掉就好了瞎说的,哈哈
      

  4.   

    ActionFrom能转是因为,
    在Struts-config.xml文件中指定的都是具体的ActionFrom的子类.
    STRUTS在生成对象的时候,是生成对应ActionFrom子类的实例的.
    传递给ACTION的时候,用的是ActionFrom这个类.这就是面向对象开发方法中的多态的用法.
      

  5.   

    一般多态的用法对于A a = new B()可以理解
    但是B b = (B)a 我只有在Struts框架中看到 对它为什么这样做很迷惑,还请大虾们多多指教!
      

  6.   

    2楼的是把子类B转换成父类A了好吧
    报异常是因为b.func1();不知道你要调哪个func1
    因为B类里面有一个,A类里面也有一个而B继承了A所以b.func1();会找到两个func1();以至于JVM不知道调哪个而报错
      

  7.   

    父类无法转换成子类的lucky8star你理解错了。你的form是extends ActionForm,而你在Action中获取到的form是从ActionForm中强转过来的,也就是说还是子类
      

  8.   

    是什么才能转换成什么.
    A时父类
    B继承A是子类
    你把A的对象a转换成B类肯定转不了啦 。。
    举个例子
    A为水果类。
    B为苹果类
    你可以把苹果称作水果
    但是你可以把水果称作苹果吗??
    那是不能的。
    你说的Structs中的转化问题:那是父类的应用指向子类的实例。然后再转成子类的引用。
    就相当于我们想把水果的引用指向一个苹果。
    然后再把水果转换成苹果。这样是没问题的。因为水果指向的本来就是苹果
    这样说不知道是否明白
      

  9.   

          lz你理解有点问题,java的强制转换是用在当子类对象上传给父类后,需要重新获取子类对象时,使用下传,将对象强制装换成子类对象。也就是说原先的对象最开始就是子类的,只是在上传的时候丢失了具体的类型。
          现在你想将父类的对象转换成子类的对象,这是不可能的,在每个类中都有一个Class类,来存放每个类的具体信息,这样保证类在上传和下传时都能找到最原始的类。
          Structs里面ActionFrom中真正传入的是子类的对象,只是把它上传给了一个父类的引用,所以这个对象的Class类存放的是子类的信息,强制转换成子类,当然是可以的。就像是:Father a = new Son();Son b = (Son)a;
          而lz你现在是想把Father a = new Father();Son b = (Son)a;这是完全不同的,前者Class中存放的是子类的信息(包括一些方法、变量和块),后者存放的是父类的信息。
          不知道这样说lz明白吗?
      

  10.   

    这样就可以;
    Struts中的ActionForm也是这样做的ActionForm form = new 你自己定义的实现类
    这样你就可以向下转换了。
      

  11.   

    A a = new B();   
      B b = (B)a;  
     
      

  12.   

    父类对象不能强转为子类对象,子类可以转为父类。---------------------------------
    A a = new B();   
    B b = (B)a;这里的new B()本身就是子类的对象,只是使用了父类的引用a指向它! 
      

  13.   

    很经典啊,这个是j2se中多态的内容,我再来补充下:
    子类可以以父类的身份出现( A a=new B();)但做事情时还是按自己的方法做:a.func1()输出的结果是"B.func1"
    父类不可以以子类身份出现(B b=new A();),因为会报向下转型异常
      

  14.   

    不可能找不到,jvm会自动找到该对象真正的对应方法的,这个叫动态绑定
      

  15.   

    建议买本孙卫琴编著的Java书籍,里面讲得很清楚。A extends B   A a = new B(); B b = (B)a;