我的类加载器有什么问题?转换为同一个类时ClassCastException!

时间:2011-07-05 06:02:23

标签: java classloader classcastexception java-7

在任何人关闭之前这是this的副本,请抓住你的马,这有点不同:-)

我有一个正在SwingWorker中使用的A类。所以,该程序看起来像这样:

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:class,看看这个类是如何加载的。我可以看到A在执行doInBackground()方法时只加载一次。但是,一旦控制返回someMethod(),列表上的for循环迭代就会引发ClassCastException !!它是这样的:

  

线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException:[Lcom.model.A;无法转换为com.model.A]

我不知道为什么这不起作用。我尝试使用Class.forName()并在someMethod()中预加载类A,然后调用SwingWorker,而在不传递类加载器实例的情况下执行此操作,同一个类被加载两次!在将类加载器作为param发送之后,类只能精确加载一次,但拒绝强制转换!!

需要帮助! :(

2 个答案:

答案 0 :(得分:4)

[Lcom.model.A; cannot be cast to com.model.A]
^^

您正在尝试将com.model.A[]实例强制转换为com.model.A实例。

答案 1 :(得分:2)

我认为系统抱怨数组被转换为类 * * com.model.A;无法施展 com.model.A

请以调试模式运行程序&amp;看看你是否得到一个数组来代替一个对象。