[英]Why does this casting from a super to a sub-interface work?
我正在从Spring Boot指南中看这个示例:
@Component
public class SimpleCORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
并为此感到困惑:
HttpServletResponse response = (HttpServletResponse) res;
我知道从ServletResponse
到HttpServletResponse
是必要的,因为后者的接口具有#setHeader()
。 但是,为什么这种转换有效呢? 因为传递给该方法的基础对象是HttpServletResponse
它是否起作用?
但是除了运行时,编译器为什么允许这样做? 我是Java的新手,并且希望这种转换会失败,因为它的类型从少到多。 例如,使用Element和Vertex ,我失败了:
Vertex v = (Vertex) e; // `e` is an `Element`
JLS很好地解释了这一点。
5.1.6缩小参考转换
此类转换需要在运行时进行测试,以查明实际参考值是否为新类型的合法值。 如果不是,则抛出ClassCastException。
即,当您进行此类转换时,您将类型S 显式转换为类型T。这样做是告诉编译器“我确定可以。”
如果您认为它可能会失败,则应try...catch
ClassCastException
并停止程序意外终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.