Akh*_*oni 0 java generics object-initialization
请先看一下这个片段:
public MultiThreadManager( Class<T> c) {
T[] allJobs = (T[]) Array.newInstance( c , MAX_THREAD_SIZE ) ;
for ( int i = 0 ; i < MAX_THREAD_SIZE ; i ++ ) {
allJobs[i] = (T) new Object();
service.submit( allJobs[i] );
getWaitingThreads().add( allJobs[i] );
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个例外:
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to slave.JobTemplate
Run Code Online (Sandbox Code Playgroud)
我想做什么:
MultiThreadManager的构造函数应该采用实现Callable的泛型类型(比如Job.java).创建所有这些通用数据类型(Job,java)的数组.初始化它,以便通用数据类型(Job.java)的构造函数将在执行程序服务中运行并执行它们.
请帮我识别我的错误或建议更好的方法.
先感谢您
谢谢大家,但事情稍微复杂一点:Herez其他信息:
public class Job extends JobTemplate<String> {...details ...}
public abstract class JobTemplate< T > implements Callable<T> {...details..}
Run Code Online (Sandbox Code Playgroud)
最后
MultiThreadManager< Job > threadManager = new MultiThreadManager< Job >( Job.class );
Run Code Online (Sandbox Code Playgroud)
再次感谢:)
您需要更多反射,就像您需要创建数组一样:
allJobs[i] = c.newInstance();
Run Code Online (Sandbox Code Playgroud)
并使用try-catch围绕所有那些讨厌的检查异常.
但是,我建议使用,new Callable[]因为没有必要深入了解实际工作类型的细节.您还应该考虑不需要反射的设计:调用者实例化作业而不是传入类对象.当前解决方案受到仅通过默认构造函数实例化的Job类型的限制.