我正在看这个例子 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;
我知道从 ServletResponse
到 HttpServletResponse
的转换是必要的,因为后者接口(interface)具有 #setHeader()
。但为什么这个 Actor 阵容有效呢?它是否有效,因为传递给该方法的底层对象是 HttpServletResponse ?
但是除了运行时之外,为什么编译器允许这样做?我是 Java 新手,预计此转换会失败,因为它是从不太具体的类型到更具体的类型。例如,使用 Element和 Vertex ,我遇到过这个失败:
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/