Eclipse编译错误:类型“类名”的层次结构不一致。

157

我下载了一些用Java编写的开源软件,并尝试使用Eclipse编译它。 在某些文件中,我收到了错误信息:“类型 '类名' 的层次结构不一致”。 这些错误是由什么原因引起的?我该如何解决?

24个回答

180

这意味着你试图实现一个不存在的接口或继承一个不存在的类。

尝试刷新你的Eclipse。

如果仍无法解决,可能是因为你引用了一个不在构建路径中的JAR。 检查你项目的classpath并验证包含接口或类的jar文件是否在其中。


3
同样的问题,我在Spring Tool Suite中有一个Maven依赖项导致了这个错误,解决方法是对涉及到的依赖项执行"Maven" > "Download Source"。 - MrLore
2
还要检查父类是否被编译。在我的情况下,我知道超类存在,但它实际上没有被正确编译。 - Joe M
2
我有一个类继承了一个抽象类,该抽象类实现了一个缺失的(在Eclipse中重命名的)接口。 - Aquarius Power
5
在我的情况下,我正在扩展一个已经在类路径中(一个jar文件)的类,但它又扩展了第三个类,而该类在不同的一个jar文件中,该jar文件不在我的类路径中。 - JustinKSU
这可能是由层次结构中的任何不正确实现引起的,不仅仅是直接实现。例如,A扩展B,B实现C...如果B缺少C导入,则会在A中出现错误消息。 - Jean-François Savard
显示剩余2条评论

16
有时候,当您添加一个您需要的 jar 包时,可能会遗漏它所需的 jar 包。在我的情况下,将 tomcat/lib 中的所有 jar 包添加进来可以帮助我解决这个问题。我正在开发一个 web 应用程序。

谢谢,这就是我的问题。我包含了GWT库,但缺少了Java Servlet API jar(在这种情况下,来自Jetty的servlet-api-3.1.jar)。 - Jamie

13

检查您的错误(选项卡“标记”)。我也遇到了以下错误:

  

项目中所需库的归档文件无法读取...

当修复了这个问题后,“不一致性错误”也消失了。

实际上,我已将jar添加到构建路径中,但由于某种原因它们无法被读取并出现错误

  

项目中所需库的归档文件无法读取或不是有效的ZIP文件

所以,我将它们作为“外部JAR”添加。这有所帮助,所有编译问题都解决了!


6

我还遇到过一个案例。请提供正确的项目路径,并将其导入到eclipse中。

然后转到 项目--> 清理 --> 清理所有项目。


5

您应该清理项目,或重新启动Eclipse。


5

我在将JDK升级到新版本后遇到了这个问题。我不得不更新“项目属性/Java构建路径”中的库引用。


2
问题可能是您已经包含了错误的JAR文件。我曾经遇到过同样的问题,原因是我在项目的构建路径中包含了错误的默认JRE库。我安装了另一个版本的Java,并且正在包含不同版本的Java的JRE文件。(我在系统中安装了JRE 1.6,并且由于之前安装的Java,正在构建路径中包含JRE库1.7)。也许您可以检查一下您在构建路径中包含的JRE库是否为正确的版本,即您在系统中安装的Java版本。

2

错误: 类型"hierarchy of the type "class name" is inconsistent error"的层次结构不一致。

解决方法: class OtherDepJar {} --> 在 "other.dep.jar" 中。

class DepJar extends OtherDepJar {} --> 在 "dep.jar" 中。

class ProblematicClass extends DepJar {} --> 在当前项目中。

如果dep.jar在项目的类路径中,但是other.dep.jar不在项目的类路径中,则Eclipse会显示"The hierarchy of the type...is inconsistent error"。


2

如果你的类路径中有一个库文件中的某个类引用了不存在的类(可能在另一个jar文件中),那么就会出现这个错误。在这种情况下,我没有添加org.springframework.beans-3.1.2.RELEASE.jar,并且从org.springframework.jdbc-3.1.2.RELEASE.jar中继承了一个类org.springframework.jdbc.core.support.JdbcDaoSupport,因此收到了这个错误。


2

我曾在Eclipse Juno上遇到过这个问题,根本原因是虽然一些spring jars被包含在瞬态maven依赖项中,但它们的版本不正确。

所以你应该检查是否使用了像spring这样的模块化框架,每个模块(或至少是最重要的:core、beans、context、aop、tx等)都是相同的版本。

为了解决这个问题,我使用了maven依赖性排除来避免瞬态依赖项的错误版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接