2013-03-04 109 views
0

我有几类:嵌套泛型

标准类:

WorkflowGraphModel:

public class WorkflowGraphModel<T> implements IWorkflowGraphModel<T> 

public WorkflowGraphModel(List<IWorkflowGraphEntry<T>> entries) 
{ 
    this.entries = entries; 
} 

WorkflowGraphEntry:

public class WorkflowGraphEntry<T> implements IWorkflowGraphEntry<T> 

特殊的实现:

ApprovalStepGraphEntry

public class ApprovalStepGraphEntry extends WorkflowGraphEntry<ApprovalStep> 

ApprovalStepGraphModel

public class ApprovalStepGraphModel extends WorkflowGraphModel<ApprovalStepGraphEntry> 

public ApprovalStepGraphModel(List<ApprovalStepGraphEntry> stepEntries) 
{ 
    super(stepEntries); 
} 

有主叫

super(stepEntries); 

WorkflowGraphModel(java.util.List中>)时是一个错误in WorkflowGraphModel不能应用于(java.util.List)

我不知道为什么编译器不知道ApprovalStepGraphEntry实现IWorkflowGraphEntry。在我看来,泛型很好。

回答

1

类型List <IWorkflowGraphEntry <ApprovalStep>>是不是从List <ApprovalStepGraphEntry>分配。你应该改变List <IWorkflowGraphEntry <ApprovalStep>>List<? extends IWorkflowGraphEntry <ApprovalStep>>或类似的东西。

下面是上述类型不兼容的解释。让我们考虑,我们有:

interface A {...} 
class B extends A {...} 
class B1 extends A {...} 
interface C <T> {public void set (T t);} 

再下面是不正确的:

C <A> ca; 
C <B> cb = ...; 
ca = cb; // Error here 
ca.set (new B1()); // Correct! 

注意,一旦ca被声明为C <A> ca,方法ca.set接受A类型的参数,从而new B1()是它有效值。同时,方法cb.set接受类型B的参数,因此new B1()对于此参数不是有效值。如果我们能够将cb分配给ca,那么稍后我们将能够呼叫ca.set (new B1()),这将会将无效类型的值传递给set方法。为了防止出现这种情况,即使AB兼容,编译器也会将C <A>C <B>类型视为不兼容。

+0

感谢你,帮助! – Rooboo 2013-03-04 09:34:55

0

您的ApprovalStepGraphEntry没有实现IWorkflowGraphEntry,它扩展了WorkflowGraphEntry,这反过来实现了接口。您需要进行这种区分明确定义泛型类型时:

而不是

public WorkflowGraphModel(List<IWorkflowGraphEntry<T>> entries) 

你需要

public WorkflowGraphModel(List<? extends IWorkflowGraphEntry<T>> entries) 
+0

我也谢谢你!我认为编译器会检查WorkflowGraphEntry是否实现IWorkflowGraphEntry。 – Rooboo 2013-03-04 09:36:25