【问题标题】:Java Class<T> static method forName() IncompatibleClassChangeErrorJava Class<T> 静态方法 forName() IncompatibleClassChangeError
【发布时间】:2010-05-24 04:07:10
【问题描述】:

私有静态 Importable getRightInstance(String s) 抛出异常 { 类 c = Class.forName(s).asSubclass(Importable.class); 可导入 i = c.newInstance(); 返回我; }

我也可以写

private static Importable getRightInstance(String s) throws Exception {
   Class<? extends Importable> c = (Class<? extends Importable>)Class.forName(s);
   Importable i = c.newInstance();
   return i;
}

private static Importable getRightInstance(String s) throws Exception {
   Class<?> c = Class.forName(s);
   Importable i = (Importable)c.newInstance();
   return i;
}

其中 Importable 是一个接口,s 是一个表示实现类的字符串。 好吧,无论如何,它给出了以下内容:

Exception in thread "main" java.lang.IncompatibleClassChangeError: class C1 has
interface Importable as super class

这是堆栈跟踪的最后一个 sn-p:

 at java.lang.Class.forName(Class.java:169)
 at Importer.getRightImportable(Importer.java:33)
 at Importer.importAll(Importer.java:44)
 at Test.main(Test.java:16)

现在,C1 类实际上实现了 Importable,我完全不明白它为什么抱怨。

提前致谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    IncompatibleClassChangeError 表示您正在加载的类文件有问题。在这种情况下,听起来Importable 在编译C1 时原本是一个类,而现在您已将其更改为接口。由于 JVM 关心extends SomeClassimplements SomeInterface 之间的区别,因此您需要针对当前的Importable 接口重新编译C1(并且可能还将其代码从extends 更改为implements

    【讨论】:

    • 已知 Hibernate 在某些不兼容版本之间切换时会引发此异常。
    • 是的,你是对的。问题是当 Importable 是一个抽象类时我编译了 C1。声明 C1 实现 Importable 而不重新编译它是没有用的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多