Java Class <T>статический метод forName () IncompatibleClassChangeError - PullRequest
3 голосов
/ 24 мая 2010

private static Importable getRightInstance (String s) генерирует исключение {Class 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

Вот последний фрагмент трассировки стека:

 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, и я полностью не 'не понимаю, почему это жалобы.

Заранее спасибо.

1 Ответ

1 голос
/ 24 мая 2010

IncompatibleClassChangeError означает, что что-то не так с файлом класса, который вы загружаете.В этом случае кажется, что Importable изначально был классом, когда C1 был скомпилирован, и теперь вы изменили его на интерфейс.Поскольку JVM заботится о разнице между extends SomeClass и implements SomeInterface, вам нужно будет перекомпилировать C1 для текущего интерфейса Importable (и, возможно, также изменить его код с extends на implements.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...