2013-04-02 31 views
0

我试图以编程方式初始化类并将其添加到列表中。我不知道如何输入workflowClass以便它extends BaseWorkflow因此列表将接受它。目前它说我预计? extends BaseWorkflow时不能添加Object如何以编程方式强制类型转换初始化类

private static List<? extends BaseWorkflow> workflowList = new ArrayList<BaseWorkflow>(); 

/** 
* Initialize the production line 
*/ 
public static void init() { 
    //load active workflows into memory 
    WorkflowService workflowService = (WorkflowService) ApplicationContextProvider.getApplicationContext().getBean("workflowService"); 
    for (Workflow workflow: workflowService.findActive()) { 
     try { 
      Class<?> clazz = Class.forName(workflow.getClassName()); 
      Object workflowClass = clazz.newInstance(); 
      workflowList.add(workflowClass); 
+1

这可能帮助:http://stackoverflow.com/questions/356583 –

回答

3

您将不能添加任何东西到List<? extends BaseWorkflow>。该清单应宣布为List<BaseWorkflow>。事实上,List<? extends BaseWorkflow>意味着:列出了某些未知类型,它是或扩展了BaseWorkflow。由于该类型是未知的,因此向该列表中添加任何内容(非null)都会破坏其类型安全性。

然后一个简单的投会做:

workflowList.add((BaseWorkflow) workflowClass); 
+0

I类虽然不是'BaseWorkflow',我需要'BaseWorkflow'的类型化版本,它可以通过'workflow.getClassName()'获得' – Webnet

+0

一个对象有一个类型,并且将它添加到列表中不会改变它。假设类名是'Foo',添加对象的类型将是'Foo'。汽车是一辆汽车。将汽车添加到车辆列表中并不会将其更改为其他内容。它仍然是一辆汽车。 –

+0

但是如果我理解正确(我可能不这样做),如果它被投射到'Vehicle'而不是'Car',那么这是不正确的? – Webnet

1

尽量明确地投对象:

workflowList.add((BaseWorkflow) workflowClass) 
相关问题