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

HttpServletRequest与ServletRequest之间的通讯,高手进入。
在程序设计里:
  
   class parent {}

   class child extends parent {}

   class test
   {
       private void testdo()
     {
        parent p=new parent();
        child c=(child) p;
      }
    }
以上,这个编译是可以通过,但执行是错误的,违反了类转换。

在资料里  
 HttpServletRequest  extends ServletRequest,与上是一样。

 但我们常用的时候,以下操作是合法的
 HttpServletRequest rq=(HttpServletRequest)ServletRequest;

请高手解答

类之间的通讯

------解决方案--------------------
parent p=new parent();
child c=(child) p;

这个转换错误是必然的,你实例化的时候是parent,而parent是父类,不能强转为子类的实例的,除非你使用parent p=new child();,这样再转换child c=(child) p;就没任何问题。


至于你说的 HttpServletRequest和ServletRequest, 那是因为ServletRequest(HttpServletRequest rq=(HttpServletRequest)ServletRequest;)这个对象实例化的时候本身就是HttpServletRequest,当然不存在强转错误的问题了。
------解决方案--------------------
HttpServletRequest rq=(HttpServletRequest)ServletRequest;
你将ServletRequest强制转换为HttpServletRequest时   其实ServletRequest运行时类型就是HttpServletRequest类型,只是用ServletRequest在引用而已 。

如果把你自己的代码修改成
 parent p=new child();
 child c=(child) p;

也是可以运行的。
------解决方案--------------------
如果吧lz的代码改成
parent p=new child();
child c=(child) p;
就能执行
HttpServletRequest  和 ServletRequest的问题也是同理

lz可以去看看多态的概念
------解决方案--------------------
HttpServletRequest rq=(HttpServletRequest)ServletRequest; 
是在httpservlet中使用的,如果不是httpservlet你这么转就会报错,在tomcat等web服务器中传来ServletRequest就是HttpServletRequest的实例,所以这么转没问题。

一般在强制转换前都会做类型检查    

if (b instanceof type) {
type new_name = (type) b;

}


------解决方案--------------------
创建的什么,才能强转为什么!