2013-03-04 172 views
0

我有幾類:嵌套泛型

標準類:

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中>)時是一個錯誤in WorkflowGraphModel不能應用於(java.util.List)

我不知道爲什麼編譯器不知道ApprovalStepGraphEntry實現IWorkflowGraphEntry。在我看來,泛型很好。

回答

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方法。爲了防止出現這種情況,即使AB兼容,編譯器也會將C <A>C <B>類型視爲不兼容。

+0

感謝你,幫助! – Rooboo 2013-03-04 09:34:55

0

您的ApprovalStepGraphEntry沒有實現IWorkflowGraphEntry,它擴展了WorkflowGraphEntry,這反過來實現了接口。您需要進行這種區分明確定義泛型類型時:

而不是

public WorkflowGraphModel(List<IWorkflowGraphEntry<T>> entries) 

你需要

public WorkflowGraphModel(List<? extends IWorkflowGraphEntry<T>> entries) 
+0

我也謝謝你!我認爲編譯器會檢查WorkflowGraphEntry是否實現IWorkflowGraphEntry。 – Rooboo 2013-03-04 09:36:25