gpt4 book ai didi

java - IntelliJ IDEA 中标有编译器错误的代码在 Eclipse 中运行良好

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:07 24 4
gpt4 key购买 nike

我正在尝试设置我的 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 parent 要求通用 CollectionString 输入.除了可能不是类型安全的之外,为什么 IntelliJ 会将此标记为编译器错误而不是警告?

我无法更改这些库中的任何一个。我只是想在 IntellJ 14 中实现在 Eclipse 4.3+ 中已经可以正常运行的功能。

编辑:

我已经更新到 IntelliJ 15.0,该项目现在使用 Java 1.7 而不是 1.6。我仍然遇到 IntelliJ 的这个问题,但这个问题在 Eclipse 中根本没有出现。我可以通过 IntelliJ 使用现有的 Ant 脚本编译项目,但我无法通过 IDE 进行调试。

这是我的类定义

public class ExecutableServletResponse extends MockHttpServletResponse {
...

这是我的“消息” Pane 中显示的错误:

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 编译器,但该应用程序仍然没有完全编译,并且可能无法运行,因为它无法编译此类,结果整个 web 应用程序的一部分都没有编译.

这是我的错误截图,FWIW:

enter image description here

最佳答案

您在类中看到错误,但真正的问题是 Spring 模拟库与您使用的 Servlet 规范不兼容。如果您升级到 Servlet 3.0 规范(或添加一个可传递地引入它的依赖项),则可能会发生这种情况。检查您的依赖项并确保:

  • 仅提供 Servlet 2.5,或者
  • 您正在使用与 Servlet 3.0 兼容的 Spring 版本。还要确保您所有的 Spring 依赖项都使用相同的版本。

这个组合应该有效:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>2.0.8</version>
</dependency>

应该这样:

<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.1.0.RELEASE</version>
<scope>test</scope>
</dependency>

但这会失败:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.2.RELEASE</version>
<scope>test</scope>
</dependency>

它在 Eclipse 中有效但在 IntelliJ 中无效的事实表明您有多个提供相同类的依赖项。无法保证系统将使用哪个 jar 来加载类。这可能是因为你的类路径上同时有 servlet-apijavaee-web-api 或者因为你有 spring-mockspring-test 在你的类路径上。在 2.0.8 版本之后,spring-mock 中的类被移动到 spring-test 并且只有 3.1.0.RELEASE 及更高版本的 spring-test 与 Servlet 3.0 兼容。

关于java - IntelliJ IDEA 中标有编译器错误的代码在 Eclipse 中运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31300898/

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