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>)WorkflowGraphModel を(java.util.List)に適用できません

ApprovalStepGraphEntryコンパイラがそれを実装していることを知らない理由はわかりませんIWorkflowGraphEntry。私の意見では、ジェネリックはうまく設定されています。

4

2 に答える 2

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は type のパラメーターを受け入れるAためnew B1()、有効な値であることに注意してください。同時に、 methodは typeのcb.setパラメーターを受け入れるため、このパラメーターの有効な値ではありません。に割り当てることができれば、後で呼び出して、無効な型の値を set メソッドに渡すことができます。このような状況を防ぐために、コンパイラは、とが互換性がある場合でも、との型を互換性がないものとして扱います。Bnew B1()cbcaca.set (new B1())C <A>C <B>AB

于 2013-03-04T08:54:03.577 に答える
0

あなたApprovalStepGraphEntryは実装しませんIWorkflowGraphEntry、それは拡張しますWorkflowGraphEntry、そしてそれは次にインターフェースを実装します。ジェネリック型を定義するときは、この区別を明確にする必要があります。

それ以外の

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

あなたが必要です

public WorkflowGraphModel( List<? extends IWorkflowGraphEntry<T>> entries )
于 2013-03-04T09:03:52.593 に答える