我上了几节课:
标准课程:
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}}。在我看来,仿制药很好。
答案 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>
兼容,编译器也会将A
和B
类型视为不兼容。
答案 1 :(得分:0)
您的ApprovalStepGraphEntry
未实现IWorkflowGraphEntry
,它会扩展WorkflowGraphEntry
,而public WorkflowGraphModel( List<IWorkflowGraphEntry<T>> entries )
会实现接口。在定义泛型类型时,您需要明确区分:
而不是
public WorkflowGraphModel( List<? extends IWorkflowGraphEntry<T>> entries )
你需要
{{1}}