即使从父类转换实际上是转换为子类的实例,也会抛出 Java Class Cast Exception

标签 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 类)?

最佳答案

ThreadFactory 围绕 Runnable 包装一个线程。因此,它正在创建一些其他类型的 Thread,它将在启动时调用 BackgroundThreadrun() 方法。

您可能想要做的是创建您自己的 ThreadFactory 实现来创建 BackgroundThread

关于即使从父类转换实际上是转换为子类的实例,也会抛出 Java Class Cast Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761521/

相关文章:

java - 返回 int 数组时不使用变量 - NetBeans

java - 未找到与给定名称匹配的资源,即使该资源存在

java - ClassCastException,将 Integer 转换为 Double

java - 引用 ImageView 子类获取 ClassCastException

java - ListView 适配器 Android 内的 ListView

java - 如何从谷歌搜索结果页面检索数据并保存该数据,是否可能..?

android - 从 android 上的 IP 摄像机接收视频流

java - 还有什么可以在java中抛出ClassCastException?

java - 依赖项未复制到 jar 中(在 Gradle 中)

android - 如何使用 NanoHTTPD 在 Android 中一次下载两个或多个文件?