[英]Nested 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中>)在WorkflowGraphModel
不能被应用到(java.util.List的)
我不知道为什么编译器不知道ApprovalStepGraphEntry
实现IWorkflowGraphEntry
。 在我看来,泛型的设置很好。
无法从List <ApprovalStepGraphEntry>
分配类型List <IWorkflowGraphEntry <ApprovalStep>>
。 您可能应该将List <IWorkflowGraphEntry <ApprovalStep>>
更改为List<? extends 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方法。 为避免这种情况,即使A
和B
兼容,编译器也将C <A>
和C <B>
类型视为不兼容。
您的ApprovalStepGraphEntry
没有实现IWorkflowGraphEntry
,而是扩展了WorkflowGraphEntry
,后者又实现了该接口。 在定义泛型类型时,需要明确区分:
代替
public WorkflowGraphModel( List<IWorkflowGraphEntry<T>> entries )
你需要
public WorkflowGraphModel( List<? extends IWorkflowGraphEntry<T>> entries )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.