}web
由于要用到HttpServletRequest中的方法,我对ServletRequest进行了强转,而后问题解决。但是后来一想不对啊,咱们知道我 们对子类实现进行向上转型获得父类对象是安全的,由于子类会彻底继承父类的方法,咱们向上转型为父类,当咱们调用父类的方法其实在子类实现中是能彻底找到 的。反之向下转型是不安全的,咱们子类除了彻底继承父类的方法外还会拓展本身的方法,因此咱们在调用子类方法时可能在父类实现中是找不到的,因此向下转型 不安全。安全
但是本例中的实现却让咱们困惑,咱们不只实现了向下转型,同时还调用了子类拓展的方法,是父类没有的,但是却实现了。这不是和咱们所学矛盾吗?后来看了API和一些资料我终于明白了,这和咱们所学其实并不冲突!咱们先看API:测试
public interface HttpServletRequest extends ServletRequestspa
终于找到缘由了,原来HttpServletRequest和ServletRequest都是接口,他们都只是定义了方法却没有提供相关实现。因此咱们看到的ServletRequest request中的request对象其实并非咱们ServletRequest 的一个具体实现。对象
这里咱们要看咱们提出的问题是否安全,其实主要看request 对象的具体实现类到底是继承的哪一个接口,若是继承自HttpServletRequest接口那么咱们向下转型使用HttpServletRequest接口的方法就是安全的。测试以下:继承
if(request instanceof HttpServletRequest){
System.out.println("我是右边类的实例");
}接口
输出:我是右边类的实例,证实咱们的request对象的确是HttpServletRequest的一个实例。ci
疑问解决。it