簡體   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