[英]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.