我从我的代码中得到了一个奇怪的运行时错误:
"Found interface [SomeInterface] but class was expected"
这是怎么发生的?接口怎么会被实例化?
更新:(回应一些答案)我正在编译并运行相同的库,但我正在使用Guice为这个特定的接口注入提供程序。
当我将一个实现绑定到接口时,问题就解决了(似乎@ImplementedBy注释不够用)。
我更感兴趣的是Guice实际上如何管理实例化接口的机制。
当运行时类路径与编译时类路径不同时,就会出现这种情况。
当应用程序被编译时,一个名为SomeInterface
的类存在。
当应用程序在运行时,在编译时存在的SomeInterface
将存在为一个接口(而不是一个类)。
这会导致一个IncompatibleClassChangeError
在运行时抛出。
如果在编译时类路径和运行时类路径上拥有不同版本的jar文件,这是一种常见情况。
很可能代码是编译在一个库中的类上,而你运行的版本将其更改为接口。
我有同样的问题。我的应用程序使用了两个jar库。其中一个库是建立在另一个库之上的。
库A定义了顶层类和接口。库B需要使用库A。
这是库B中使用的一些代码的伪代码:
TheInterface instance = new TheClass();
instance.someMethod();
TheInterface
不再包含someMethod
,但TheClass
仍然包含。唯一的解决方法是获取其中一个jar的源代码,并手动更改这些内容(如果可能的话)。听起来你做了
class MyClass extends SomeInterface
实际上应该是这样
class MyClass implements SomeInterface
我是对的吗?
编辑:哦,你说这是一个运行时错误而不是编译时错误?让我找找看...
编辑2:看起来Jared有正确的答案。无论如何,尝试扩展一个接口实际上会在编译时给出一个"此处不应该有接口"的消息,而不是一个"找到接口但期望的是类"的错误。
lein
命令无法工作。我该如何解决这个问题? - rzvmvn clean
。 - skytreader