IntelliJ IDEA中的java代码标记为编译器错误,在Eclipse中可以正常工作
我正在尝试设置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中实现在Eclipse4.3+中已经可以正常工作的功能
编辑:
我已经更新到Intellij15.0,该项目现在使用Java1.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
project SDK使用的是1.7版(确切地说是1.7.079)。语言水平为7级。模块SDK和语言级别与项目匹配
我已经尝试过使用eclipse编译器,但是应用程序仍然没有完全编译,并且可能无法运行,因为它无法编译这个类,而webapp的整个部分也无法编译
以下是我的错误截图,FWIW:
# 1 楼答案
您在类中看到了错误,但真正的问题是Spring模拟库与您正在使用的Servlet规范不兼容。如果您升级到Servlet3.0规范(或者添加了一个依赖项以传递方式将其拉入),则可能会发生这种情况。检查您的依赖项并确保:
这一组合应该有效:
这应该是:
但这将失败:
它在Eclipse中工作,但在IntelliJ中不工作,这表明您有多个提供相同类的依赖项。无法保证系统将使用哪个jar加载该类。这可能是因为类路径上同时有
servlet-api
和javaee-web-api
,或者是因为类路径上同时有spring-mock
和spring-test
。在版本2.0.8之后,spring-mock
中的类被移动到spring-test
并且只移动到版本3.1.0。spring-test
的发行版和更高版本与Servlet 3.0兼容