【发布时间】:2015-09-26 20:23:08
【问题描述】:
我正在尝试设置我的 IntelliJ 工作区以在 Eclipse 项目上进行开发。我遇到的一件事相当令人困惑:
Error:(24, 8) java: SomeClass.java:24: getHeader(java.lang.String) in org.springframework.mock.web.MockHttpServletResponse cannot implement getHeader(java.lang.String) in javax.servlet.http.HttpServletResponse; attempting to use incompatible return type
found : java.lang.Object
required: java.lang.String
问题在于下面的类定义:
public class SomeClass extends MockHttpServletResponse {
问题似乎是因为 MockHttpServletResponse 将 Collection<String> getHeaders(String) 实现为 public List getHeaders(String name)。在这里,我可以看到实现方法使用了原始List,其中父请求使用String 键入的通用Collection。除了可能不安全之外,为什么 IntelliJ 会将其标记为编译器错误而不是警告?
我无法更改这些库中的任何一个。我只是想在 IntellJ 14 中工作,而在 Eclipse 4.3+ 中已经可以正常工作。
编辑:
我已经更新到 IntelliJ 15.0,并且该项目现在使用 Java 1.7 而不是 1.6。我仍然遇到 IntelliJ 的这个问题,但是这个问题在 Eclipse 中根本没有出现。我可以通过 IntelliJ 使用现有的 Ant 脚本编译项目,但无法通过 IDE 进行调试。
这是我的类定义
public class ExecutableServletResponse extends MockHttpServletResponse {
...
这是我的“消息”窗格中显示的错误:
Error:(24, 8) java: getHeader(java.lang.String) in org.springframework.mock.web.MockHttpServletResponse cannot implement getHeader(java.lang.String) in javax.servlet.http.HttpServletResponse
return type java.lang.Object is not compatible with java.lang.String
项目 SDK 使用的是 1.7 版本(准确地说是 1.7.0_79)。语言级别为 7。模块 SDK 和语言级别与项目匹配。
我已经尝试使用 eclipse 编译器,但是应用程序仍然没有完全编译,并且可能无法运行,因为它无法编译此类,因此整个 webapp 的一部分没有编译.
这是我的错误截图,FWIW:
【问题讨论】:
-
你在这两种情况下使用相同的JDK吗?
-
和相同的合规级别?
-
根据我的项目设置(使用 ctrl+alt+shift+s)显示我使用 1.6 作为项目 SDK 和 1.6 作为语言级别(用于项目和所有模块)。这似乎与我在 Eclipse 中的相同(使用 jdk1.6.0_45 和 1.6 JDK 兼容)
-
嗯...Spring Javadoc 说 getHeaders 正确返回 List
。此外,它抱怨有一个方法 Object getHeader(String)而不是String getHeader(String),而不是关于getHeaders。你在你的子类中覆盖了 getHeader 吗? -
您的 IntelliJ 设置是否可能以某种方式使用不同的 servlet 依赖项?我刚试过,Spring 2.5.6 + servlet 3 会产生这个错误,而 Spring 2.5.6 和 servlet 2.5 不会。有一个 issue in Spring JIRA 与 Servlet 3 不兼容,Spring 3.1 已修复此问题。
标签: java eclipse spring servlets intellij-idea