抛出Java类Cast Exception,即使cast-from父类实际上是cast-to subclass的实例

时间:2013-02-07 21:41:04

标签: java android classcastexception

我正在尝试将返回的Thread对象从Java的ThreadFactory.newThread(Runnable r)转换为我的Android应用程序使用的Thread的特定子类,如下所示:

private ThreadFactory mvThreadSource = Executors.defaultThreadFactory();

...

//Invokes the thread factory's newThread(Runnable r) method 
//mvThreadsVector is an ArrayList<BackgroundThread>
//class BackgroundThread extends Thread and implements an interface
public void spawnBGThreads(int numThreads){
 for (int i=0;i<numThreads;i++){
  mvThreadsVector.add((BackgroundThread) mvThreadSource.newThread(new
  BackgroundThread())); 
 }
}

这会抛出一个类强制转换异常,但我不确定为什么;我知道我似乎在尝试向下转换无法完成的内容,但mvThreadSource.newThread(new BackgroundThread())返回的Thread实际上应该是BackgroundThread的一个实例。根据我的理解,这应该使我在上面尝试“向下转换”合法(因为它不应该真的是向下转换),但Android运行时(针对SDK修订版17)不同意。上述演员的违法行为是什么?我应该使用什么替代方法(希望没有创建我自己的扩展ThreadFactory的BackgroundThreadFactory类)?

3 个答案:

答案 0 :(得分:4)

ThreadFactoryRunnable周围包裹一个帖子。因此,它正在创建其他类型的Thread,它会在run()启动时调用BackgroundThread方法。

您可能要做的是创建自己的ThreadFactory实施,以创建BackgroundThread

答案 1 :(得分:3)

  

但mvThreadSource.newThread(new BackgroundThread())返回的Thread实际上应该是BackgroundThread的一个实例

是什么让你这么想?

是什么让您认为首先将Thread的实例传递给ThreadFactory.newThread是个好主意?在某些情况下,创建Thread实例而不启动它们实际上会导致内存泄漏,我相信。 (很可能不在Android上,请注意。)

ThreadFactory.newThread的参数属于Runnable类型而不是Thread的原因有一个原因 - 它只是意味着是“应该运行的动作“而不是一个线程。创建线程来运行动作是ThreadFactory的工作 - 这就是为什么它被称为ThreadFactory:)

可以创建自己的ThreadFactory创建BackgroundThread个实例,但不清楚为什么要首先这样做。你的实际要求是什么?也许您实际上不应该构建List<BackgroundThread>而是List<BackgroundRunnable>,其中BackgroundRunnable是一个扩展Runnable的接口,并且您可以使用任何额外的方法...

答案 2 :(得分:2)

不,ThreadFactory.newThread返回一个Thread:

class SimpleThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        return new Thread(r);
    }
}

由newThread返回的线程不是BackGroundThread - &gt;代码中的ClassCastException。

请注意,newThread的输入参数采用Runnable。你的BackGroundThread是一个Runnable,但newThread并不意味着接受Threads。它应该接受将被包装到线程中的Runnables。