读书人

HttpServletRequest与ServletRequest之

发布时间: 2013-04-07 12:50:11 作者: rapoo

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;

}


[解决办法]
创建的什么,才能强转为什么!

读书人网 >Java相关

热点推荐