代码之家  ›  专栏  ›  技术社区  ›  levik

Java错误:发现接口…但类是预期的

  •  31
  • levik  · 技术社区  · 17 年前

    我的代码中有一个奇怪的运行时错误:

    "Found interface [SomeInterface] but class was expected"
    

    怎么会这样?如何实例化接口?

    更新: (回应一些答案)我正在编译和运行同一组库,但是我 使用 Guice 为此特定接口注入提供程序。

    当我将一个实现绑定到接口时,问题就消失了(似乎@implementedby注释还不够)。

    我更感兴趣的是Guice通过它实际实例化接口的机制。

    5 回复  |  直到 7 年前
        1
  •  63
  •   Jared    17 年前

    当运行时类路径与编译时类路径不同时,就会发生这种情况。

    编译应用程序时,类 SomeInterface 在你的问题中)作为一个班级存在。

    当应用程序在编译时运行时, 某些接口 作为接口存在(而不是类)。

    这导致了 IncompatibleClassChangeError 在运行时引发。

    如果编译时类路径上的JAR文件版本与运行时类路径上的JAR文件版本不同,则通常会出现这种情况。

        2
  •  6
  •   starblue    17 年前

    最有可能的情况是,代码是根据库中的类编译的,然后在您运行的版本中将该类更改为接口。

        3
  •  2
  •   Mark Jeronimus    14 年前

    我也有同样的问题。我在应用程序中使用了两个JAR库。一个图书馆建在另一个图书馆的基础上。

    库A定义顶级类和接口。图书馆B需要图书馆A。

    这是库B中使用的某些代码的伪代码:

    TheInterface instance = new TheClass();
    instance.someMethod();
    

    显然,图书馆A比图书馆B更新,而且 TheInterface 不包含 someMethod 不再,但 TheClass 仍然如此。解决这个问题的唯一方法是获取任意一个jar的源代码,并手动更改这些内容(如果可能的话)。

        4
  •  1
  •   Michael Myers KitsuneYMG    17 年前

    听起来像是你做的

    class MyClass extends SomeInterface
    

    实际上应该是什么时候

    class MyClass implements SomeInterface
    

    我说的对吗?

    编辑:哦,你说是 运行时 错误而不是 编译时间 错误?让我四处看看…

    编辑2:看起来贾里德的答案是正确的。无论如何,尝试扩展接口实际上会 此处不需要接口 编译时的消息,而不是 找到接口,但需要类 “错误。

        5
  •  1
  •   Pradeep Anchan    7 年前

    当我运行一个 maven build .

    从我所能收集到的(以及贾里德的) answer )原因是-在我的有效文件中指定了同一第三方JAR的两个版本 pom.xml . 一个版本作为 transitive dependency 另一个是我在当地指定的 XML .

    所以在编译时,它指的是旧版本,在运行时指的是新版本。

    我删除了本地指定的版本 XML 它奏效了。

    当然,第三方破坏了它们版本之间的向后兼容性,并将类更改为接口,反之亦然。但他们可以这样做。