Java通用对象初始化

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)

再次感谢:)

Mar*_*nik 5

您需要更多反射,就像您需要创建数组一样:

allJobs[i] = c.newInstance();
Run Code Online (Sandbox Code Playgroud)

并使用try-catch围绕所有那些讨厌的检查异常.

但是,我建议使用,new Callable[]因为没有必要深入了解实际工作类型的细节.您还应该考虑不需要反射的设计:调用者实例化作业而不是传入类对象.当前解决方案受到仅通过默认构造函数实例化的Job类型的限制.