0

我有几门课:

标准班:

工作流图模型:

public class WorkflowGraphModel<T> implements IWorkflowGraphModel<T>

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

工作流图入口:

public class WorkflowGraphEntry<T> implements IWorkflowGraphEntry<T>

特殊实现:

批准StepGraphEntry

public class ApprovalStepGraphEntry extends WorkflowGraphEntry<ApprovalStep>

批准StepGraphModel

public class ApprovalStepGraphModel extends WorkflowGraphModel<ApprovalStepGraphEntry>

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

调用时出错

super( stepEntries );

WorkflowGraphModel 无法将WorkflowGraphModel (java.util.List>)应用于 (java.util.List)

我不知道为什么编译器不知道ApprovalStepGraphEntryimplements IWorkflowGraphEntry。在我看来,泛型设置得很好。

4

2 回答 2

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()是它的有效值。同时,methodcb.set接受 type 的参数B,因此new B1()不是该参数的有效值。如果我们能够分配cbca,那么我们以后就可以调用ca.set (new B1())它将无效类型的值传递给 set 方法。为了防止这种情况,编译器将C <A>和类型视为不兼容,C <B>即使是兼容的也是如此。AB

于 2013-03-04T08:54:03.577 回答
0

ApprovalStepGraphEntry没有实现IWorkflowGraphEntry,它扩展WorkflowGraphEntry了,它又实现了接口。在定义泛型类型时需要明确这种区别:

代替

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

你需要

public WorkflowGraphModel( List<? extends IWorkflowGraphEntry<T>> entries )
于 2013-03-04T09:03:52.593 回答