java - 为什么从 super 接口(interface)到子接口(interface)的转换有效?

标签 java servlets

我正在看这个例子 Spring Boot guide :

@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 的转换是必要的,因为后者接口(interface)具有 #setHeader()。但为什么这个 Actor 阵容有效呢?它是否有效,因为传递给该方法的底层对象是 HttpServletResponse ?

但是除了运行时之外,为什么编译器允许这样做?我是 Java 新手,预计此转换会失败,因为它是从不太具体的类型到更具体的类型。例如,使用 ElementVertex ,我遇到过这个失败:

Vertex v = (Vertex) e; // `e` is an `Element`

最佳答案

The JLS几乎完美地解释了它。

5.1.6 Narrowing Reference Conversion

Such conversions require a test at run time to find out whether the actual reference value is a legitimate value of the new type. If not, then a ClassCastException is thrown.

即当您进行此类转换时,您显式将类型 S 转换为类型 T。这样做就是告诉编译器“我确信这是可以的”。

如果您认为它可能失败,那么您应该尝试...捕获 ClassCastException 并阻止程序意外终止。

关于java - 为什么从 super 接口(interface)到子接口(interface)的转换有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27991416/

相关文章:

java - Scanner.hasNext Java 中的字符串匹配

java - 声明 'FLAG_ACTIVITY_NO_ANIMATION' 后出现 NullPointerException 警告

java - 我的 ajax POST 没有发送到我的 servlet

java - 在同一个JSP网页上包含JfreeChart图表和计算结果

使用不同的 URL 进行 java servlet 测试

java - 如何将隐藏字段值从html页面传递到GWT页面?不同应用程序中的两个页面

java servlet上下文无法加载application.property文件

java - 函数返回错误结果,但在具有相同字符串参数的调试器中返回良好结果

java - 我的第二个 if 语句被忽略,不知道为什么

java - 我的 Jtable 不刷新