Что не так с моим загрузчиком классов? ClassCastException при приведении к тому же классу! - PullRequest
0 голосов
/ 05 июля 2011

Прежде чем кто-либо закроет это дубликат этого , пожалуйста, держите лошадей, это немного по-другому :-)

У меня есть класс A, который используется в SwingWorker. Итак, программа выглядит примерно так:

class Task extends SwingWorker {
      public Task(ClassLoader loader) {
          Thread.currentThread().setContextClassLoader(loader);
      }
      public List<A> doInBackground() {
          A obj = new A();
          //do some stuff with A;
          return list of A;
      }
}

И мой метод, который вызывает эту задачу, выглядит следующим образом:

public void someMethod() throws Exception {
      Task task = new Task(Thread.getCurrentThread().getContextClassLoader():
      //do something and wait for output
      List<A> result = task.get();
      for(A obj : result) {
         //do something
      }
}

Теперь я сделал java -verbose: класс, чтобы посмотреть, как этот класс загружается. Я вижу, что A загружается только один раз при выполнении метода doInBackground (). Но как только управление возвращается к someMethod (), итерация цикла for по списку вызывает исключение ClassCastException !! Это выглядит так:

Исключение в потоке "AWT-EventQueue-0" java.lang.ClassCastException: [Lcom.model.A; не может быть приведен к com.model.A]

Понятия не имею, почему это не работает. Я пытался использовать Class.forName () и предварительно загрузить класс A в someMethod (), прежде чем вызывать SwingWorker, при этом не передавая экземпляр загрузчика классов, один и тот же класс загружался дважды !! После отправки загрузчика классов в качестве параметра, класс загружается только один раз, но отказывается от приведения !!

Нужна помощь! (

Ответы [ 2 ]

4 голосов
/ 05 июля 2011
[Lcom.model.A; cannot be cast to com.model.A]
^^

Вы пытаетесь привести экземпляр com.model.A[] к экземпляру com.model.A.

2 голосов
/ 05 июля 2011

Я думаю, что система жалуется на то, что массив приводится к классу * L * com.model.A;не может быть приведен к com.model.A

. Пожалуйста, запустите программу в режиме отладки и посмотрите, получаете ли вы массив вместо объекта.

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