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を実行して、このクラスがどのようにロードされるかを確認しました。doInBackground()メソッドの実行中にAが1回だけロードされることがわかります。ただし、コントロールがsomeMethod()に戻ると、リストに対するforループの反復によりClassCastExceptionがスローされます。こんなふうになります:

スレッド「AWT-EventQueue-0」の例外java.lang.ClassCastException:[Lcom.model.A; com.model.Aにキャストできません]

なぜこれが機能しないのかわかりません。SwingWorkerを呼び出す前に、Class.forName()を使用してクラスAをsomeMethod()でプリロードしようとしましたが、クラスローダーインスタンスを渡さずにこれを実行すると、同じクラスが2回ロードされていました!! クラスローダーをparamとして送信した後、クラスは1回だけ正確にロードされますが、キャストを拒否します。

助けが必要!:(

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 に答える