Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使父类的转换实际上是转换到子类的实例,也会引发Java类转换异常_Java_Android_Classcastexception - Fatal编程技术网

即使父类的转换实际上是转换到子类的实例,也会引发Java类转换异常

即使父类的转换实际上是转换到子类的实例,也会引发Java类转换异常,java,android,classcastexception,Java,Android,Classcastexception,我试图将Java的ThreadFactory.newThreadRunnable r中返回的Thread对象强制转换为Android应用程序使用的Thread的特定子类,如下所示: private ThreadFactory mvThreadSource = Executors.defaultThreadFactory(); ... //Invokes the thread factory's newThread(Runnable r) method //mvThreadsVector i

我试图将Java的ThreadFactory.newThreadRunnable r中返回的Thread对象强制转换为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.newthreadnewbackgroundthread返回的线程实际上应该是BackgroundThread的一个实例。据我理解,这应该使我在上面尝试的“向下播放”合法化,因为它不应该真的向下播放,但针对SDK版本17的Android运行时不同意。上述演员有什么违法之处?除了创建自己的扩展ThreadFactory的BackgroundThreadFactory类之外,我应该使用什么替代方法

ThreadFactory将线程环绕在可运行线程上。因此,它正在创建一些其他类型的线程,这些线程在启动时将调用BackgroundThread的run方法

您可能想做的是创建自己的ThreadFactory实现,以创建背景线程。

ThreadFactory将线程包装在可运行线程周围。因此,它正在创建一些其他类型的线程,这些线程在启动时将调用BackgroundThread的run方法


您可能想做的是创建自己的ThreadFactory实现来创建背景线程。

否,ThreadFactory.newThread返回一个线程:

class SimpleThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        return new Thread(r);
    }
}
newThread返回的线程在代码中不是BackGroundThread->ClassCastException


请注意,newThread的输入参数采用Runnable。您的BackGroundThread是可运行的,但newThread并不意味着接受线程。它应该接受将被包装到线程中的可运行程序。

否,ThreadFactory.newThread返回一个线程:

class SimpleThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        return new Thread(r);
    }
}
newThread返回的线程在代码中不是BackGroundThread->ClassCastException

请注意,newThread的输入参数采用Runnable。您的BackGroundThread是可运行的,但newThread并不意味着接受线程。它应该接受将被包装到线程中的可运行项

但是mvThreadSource.newthreadnewbackgroundthread返回的线程实际上应该是BackgroundThread的一个实例

你怎么会这么想

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

的参数类型为Runnable而不是Thread是有原因的——它只意味着应该运行的操作而不是线程。创建线程以运行操作是ThreadFactory的工作-这就是为什么它被称为ThreadFactory:

您可以创建自己的ThreadFactory来创建BackgroundThread实例,但不清楚您首先为什么要这样做。你在这里的实际要求是什么?也许您实际上不应该构建一个列表,而应该构建一个列表,其中BackgroundRunnable是一个扩展Runnable的接口,它有您想要的任何额外方法

但是mvThreadSource.newthreadnewbackgroundthread返回的线程实际上应该是BackgroundThread的一个实例

你怎么会这么想

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

的参数类型为Runnable而不是Thread是有原因的——它只意味着应该运行的操作而不是线程。创建线程以运行操作是ThreadFactory的工作-这就是为什么它被称为ThreadFactory:


您可以创建自己的ThreadFactory来创建BackgroundThread实例,但不清楚您首先为什么要这样做。你在这里的实际要求是什么?也许您实际上不应该构建一个列表,而应该构建一个列表,其中BackgroundRunnable是一个扩展Runnable的接口,并且它有您想要的任何额外方法……

mvThreadSource.newThread做什么?ThreadFactory的实现是什么?如果没有这些信息,就不可能回答您的问题。请这样看:香蕉是水果,但水果不是香蕉。@JonSkeet抱歉,我忘了包括ThreadFactory实现;目前我只使用默认的Executors.DefaultThreadFactoryMVThreadSource.newThread做什么?ThreadFactory的实现是什么?如果没有这些信息,就不可能回答你的问题。请这样看:香蕉是水果,但水果不是香蕉。@JonSkeet对不起,我忘了
包括线程工厂的实施;目前我只使用默认的执行器。defaultThreadFactoryhmm。。。我懂了。这里的用例基本上就是我需要能够动态生成BackgroundThread实例。如果我要手动实例化BackgroundThread对象,比如通过mvThreadsVector.addnew BackgroundThread,BackgroundThread的run方法将如何/何时调用?在这种情况下,我需要手动调用它吗?哦,好吧,显然我需要仔细阅读ThreadFactory,Thread,andRunnable@CCJ:您将调用start,线程将启动。是的,听起来进一步阅读是个好主意:为什么需要有背景线程的实例?BackgroundThread有什么特别之处?BackgroundThread是我从公司合同公司的代码库继承下来的一个相当大的类。。。作为Thread的一个子类,它可以被实例化并手动启动,但现在我需要做一些计算密集型的处理,并且许多并发运行的后台线程变得很理想。我认为ThreadFactory是一个简单的答案,但我误解了ThreadFactory在幕后的工作方式。。。我目前正在研究@RussellZahniser的建议below@CCJ:为什么不直接创建BackgroundThread的多个实例呢?嗯。。。我懂了。这里的用例基本上就是我需要能够动态生成BackgroundThread实例。如果我要手动实例化BackgroundThread对象,比如通过mvThreadsVector.addnew BackgroundThread,BackgroundThread的run方法将如何/何时调用?在这种情况下,我需要手动调用它吗?哦,好吧,显然我需要仔细阅读ThreadFactory,Thread,andRunnable@CCJ:您将调用start,线程将启动。是的,听起来进一步阅读是个好主意:为什么需要有背景线程的实例?BackgroundThread有什么特别之处?BackgroundThread是我从公司合同公司的代码库继承下来的一个相当大的类。。。作为Thread的一个子类,它可以被实例化并手动启动,但现在我需要做一些计算密集型的处理,并且许多并发运行的后台线程变得很理想。我认为ThreadFactory是一个简单的答案,但我误解了ThreadFactory在幕后的工作方式。。。我目前正在研究@RussellZahniser的建议below@CCJ:为什么不直接创建BackgroundThread的多个实例呢?