0

请先看这个片段:

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] );
    }           
}

这是一个例外:

Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to slave.JobTemplate

我正在尝试做的事情:

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..}

最后

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

再次感谢:)

4

3 回答 3

5

正如您需要创建数组一样,您将需要更多反射:

allJobs[i] = c.newInstance();

并用 try-catch 包围所有那些讨厌的检查异常。

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

于 2013-11-16T20:30:37.153 回答
3

当你说new Object()时,这会创建一个 Object 类的新对象。它的动态运行时类型是 Object。所以强制转换T为逻辑上无效,除非T事实上是Object

创建 a 所需要做的T是使用反射在T.

于 2013-11-16T20:24:45.627 回答
2

Robin & Marko 展示了问题的根源,我还有一件事要强调,来自Joshua Bloch 的“Effective Java”

第 25 条:优先使用列表而不是数组
...数组和泛型有非常不同的类型规则。数组是协变和具体化的;泛型是不变的和被擦除的。因此,数组提供运行时类型安全,但不提供编译时类型安全,反之亦然。一般来说,数组和泛型不能很好地混合。如果您发现自己将它们混合在一起并收到编译时错误或警告,您的第一个冲动应该是用列表替换数组。

解释:

协变- 例如,表示对象数组是整数数组的超类型。泛型是不变的,意味着你不能将 aList<Integeer>转换为 aList<Object>

Reified - 在编译时存在的所有数组信息在运行时也可用。泛型是通过擦除实现的,这意味着它们的类型约束仅在编译时强制执行,然后被擦除(它在运行时不存在)。

总结一下
将数组与泛型混合很可能会给您带来问题 - 尝试通过使用列表而不是数组来避免将两者混合:

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));
    }
}
于 2013-11-16T20:38:49.187 回答