繁体   English   中英

为什么从超级接口转换为子接口有效?

[英]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;

我知道从ServletResponseHttpServletResponse是必要的,因为后者的接口具有#setHeader() 但是,为什么这种转换有效呢? 因为传递给该方法的基础对象是HttpServletResponse它是否起作用?

但是除了运行时,编译器为什么允许这样做? 我是Java的新手,并且希望这种转换会失败,因为它的类型从少到多。 例如,使用ElementVertex ,我失败了:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM