繁体   English   中英

嵌套泛型

[英]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方法。 为避免这种情况,即使AB兼容,编译器也将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM