嵌套泛型

时间:2013-03-04 08:50:48

标签: java generics

我上了几节课:

标准课程:

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&gt;) WorkflowGraphModel中的ApprovalStepGraphEntry无法应用于(java.util.List)

我不知道为什么编译器不知道IWorkflowGraphEntry实现了{{1}}。在我看来,仿制药很好。

2 个答案:

答案 0 :(得分: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方法。为了防止出现这种情况,即使C <A>C <B>兼容,编译器也会将AB类型视为不兼容。

答案 1 :(得分:0)

您的ApprovalStepGraphEntry未实现IWorkflowGraphEntry,它会扩展WorkflowGraphEntry,而public WorkflowGraphModel( List<IWorkflowGraphEntry<T>> entries ) 会实现接口。在定义泛型类型时,您需要明确区分:

而不是

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

你需要

{{1}}