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;
}
------解决方案--------------------创建的什么,才能强转为什么!