}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