gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:19:35 26 4
gpt4 key购买 nike

我正在看这个例子 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com