为什么类转换在run方法中失败,即使在运行之外检查了instanceof

时间:2014-05-22 16:48:38

标签: java multithreading concurrency

我有以下代码:

private void method(final Object obj){
  if (obj instanceof Processor){// assume Processor is some class
    ExecutorService ex = Executors.newSingleThreadExecutor();
ex.execute(new Runnable() {

        @Override
        public void run() {
            process((Processor) obj);//get ClassCastException here

        }
    });
}

private void process(final Processor a){
  //do something
}

我的问题是,即使我检查obj是否是Processor类的实例,然后我只将其转换为Processor run内部ClassCastException方法,我仍然得到process在我调用{{1}}()方法的行,为什么?

3 个答案:

答案 0 :(得分:1)

这是我要做的,因为obj不是最终的。

if (obj instanceof Processor) {
    final Processor processor = (Processor) obj; // use processor instead of obj.

答案 1 :(得分:1)

当您有两个类加载器从两个不同的源加载相同的类名时,有时会在同一个类之间发生转换异常,并且这些源不相同。我有时在两个应用程序之间调用EJB方法时会看到这个问题,这两个应用程序都从它们自己的内部打包jar文件加载“相同”类。如果这些内部文件不对齐,则会发生这种情况。你有没有机会从两个不同的地方加载同一个班级?

答案 2 :(得分:0)

彼得的答案可能会解决你的问题。但为什么不花时间来改进程序的整体设计。你真的想把对象传递给method(..)吗?为什么不:

interface Processable<I, O> { 
    O process(I input);
}

并拥有一个NoOp处理器,它什么都不做。你现在做的不是OO