0

在任何人关闭之前这是重复的请握住你的马,这有点不同:-)

我有一个在 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]

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

需要帮忙!:(

4

2 回答 2

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

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

于 2011-07-05T06:07:42.260 回答
2

我认为系统正在抱怨一个数组被强制转换为一个类 * L *com.model.A; 不能转换为 com.model.A

请在调试模式下运行程序,看看你是否得到一个数组来代替一个对象。

于 2011-07-05T06:08:30.933 回答