Java通用对象初始化

Java通用对象初始化,java,generics,object-initialization,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( allJob

请先看一下这个片段:

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] );
    }           
}
我想做的是:

多线程管理器的构造函数应该采用实现可调用的泛型类型(比如Job.java)。创建所有这些通用数据类型(作业、java)的数组。初始化它,以便泛型数据类型(Job.java)的构造函数将在executor服务中运行和执行它们

请帮助我识别我的错误,或者建议更好的方法

先谢谢你

谢谢大家,但事情有点复杂: 以下是其他信息:

public class Job extends JobTemplate<String> {...details ...}
public abstract class JobTemplate< T > implements Callable<T> {...details..}
公共类作业扩展作业模板{…详细信息…}
公共抽象类JobTemplate实现可调用的{…详细信息..}
最后

MultiThreadManager< Job > threadManager = new MultiThreadManager< Job >( Job.class );
multi-threadManagerthreadManager=new-multi-threadManager(Job.class);

再次感谢:)

当你说
newobject()
时,它会创建一个类Object的新对象。它的动态运行时类型是Object。因此,对
T
的强制转换在逻辑上是无效的,除非
T
实际上是
对象


创建
T
需要做的是使用反射来调用
T

上的相应构造函数。您将需要更多反射,就像创建数组一样:

allJobs[i] = c.newInstance();
并围绕着所有那些讨厌的检查异常的try-catch


但是,我建议使用
newcallable[]
,因为不需要详细说明实际的工作类型。还应该考虑不需要反射的设计:调用方实例化作业而不是传递类对象。当前解决方案受到仅通过默认构造函数实例化作业类型的限制。

Robin&Marko显示了问题的根源,我还有一件事要强调,来自:

第25项:首选列表而非数组
... 数组和泛型有非常不同的类型规则。阵列 是协变的和具体化的;泛型是不变的并被删除。作为一个 结果,数组提供运行时类型安全性,但不提供编译时 对于泛型,类型安全,反之亦然。一般来说,数组 而仿制药也不能很好地混合。如果你发现自己把它们和 得到编译时错误或警告时,您的第一个冲动应该是 用列表替换数组

说明:

协变-例如,表示对象数组是整数数组的超类型。泛型是不变性的,这意味着不能将
列表
强制转换为
列表

具体化-在编译时存在于数组中的所有信息在运行时也可用。泛型的实现意味着它们的类型约束只在编译时强制执行,然后被删除(在运行时不存在)

总而言之:
将数组与泛型混合很可能会导致问题-尝试使用列表而不是数组来避免两者的混合:

public <T> void MultiThreadManager(Class<T> c) 
                throws IllegalAccessException, InstantiationException {

    List<T> allJobs = new ArrayList<T>(MAX_THREAD_SIZE) ;
    for (int i = 0; i < MAX_THREAD_SIZE; i++) {
        allJobs.add(c.newInstance());
        service.submit( allJobs.get(i) );
        getWaitingThreads().add( allJobs.get(i));
    }
}
public void多线程管理器(c类)
抛出IllegalAccessException,实例化Exception{
列出所有作业=新阵列列表(最大线程大小);
对于(int i=0;i
谢谢你,罗宾。但是事情有点复杂:)剩下的就在这里:马克,你能检查一下我的编辑吗。。。谢谢:)非常感谢。你的建议很有帮助:)谢谢你。。。我将尝试重构
public <T> void MultiThreadManager(Class<T> c) 
                throws IllegalAccessException, InstantiationException {

    List<T> allJobs = new ArrayList<T>(MAX_THREAD_SIZE) ;
    for (int i = 0; i < MAX_THREAD_SIZE; i++) {
        allJobs.add(c.newInstance());
        service.submit( allJobs.get(i) );
        getWaitingThreads().add( allJobs.get(i));
    }
}