2

オブジェクトを追加する予定のリストを以下のように宣言しています。

List<RecursableAction<Recursable, AbstractContext>> actions = new ArrayList<>();

私はIdGeneratorItemAction以下のようなものを持っています:

public class IdGeneratorItemAction implements RecursableAction<Item, IdGeneratorContext> {
    private IdGeneratorContext context;

    @Override
    public void act(Item recursable) {
    }
}

インターフェイスRecursableActionは次のようになります。

public interface RecursableAction<R extends Recursable, C extends AbstractContext> {
    void act(R recursable);
}

次のように、のインスタンスを作成してリストIdGeneratorItemActionに追加しようとしました。actions

RecursableAction<Recursable, AbstractContext> action = new IdGeneratorItemAction();
actions.add(action);

これを実行しようとすると、次のコンパイル エラーが発生します。

RecursableAction<Recursable, AbstractContext> action = new IdGeneratorItemAction();
                                                       ^
Type mismatch: cannot convert from IdGeneratorItemAction to RecursableAction<Recursable,AbstractContext>

actionsの宣言をtoに変更してみました

List<RecursableAction<? extends Recursable, ? extends AbstractContext>> actions = new ArrayList<>();

しかし、それを行うと、 を反復処理できなくなりactionsます。

for (RecursableAction<? extends Recursable, ? extends AbstractContext> action : actions) {
    action.act(recursable);
    ^
    The method act(capture#1-of ? extends Recursable) in the type RecursableAction<capture#1-of ? extends Recursable,capture#2-of ? extends AbstractContext> is not applicable for the arguments (Recursable)
}

この問題を解決するには?

4

1 に答える 1

6

文脈がわからないとアドバイスしにくいです。は aであり、これらは互換性がないためIdGeneratorItemAction、 a に an を追加できないことは明らかです( a を期待する変数にa を代入できないのと同じように)。しかし、同様に、 a がどのようなものを期待しているのかわからないため、 aを呼び出すことはできません。List<RecursableAction<Recursable, AbstractContext>>IdGeneratorItemActionRecursableAction<Item, IdGeneratorContext>List<String>List<Object>act(recursable)RecursableAction<? extends Recursable, ? extends AbstractContext>Recursable

すべてのアクションに互換性があることがわかっている場合は、問題ありません。たとえば、

public static <R extends Recursable> void doStuff(
      List<? extends RecursableAction<R, ?>> actions, R recursable) {
  for(RecursableAction<R, ?> action : actions) {
    action.act(recursable);
  }
}

public static void main(String[] args) {
  List<RecursableAction<Item, IdGeneratorContext>> actions = new ArrayList<>();
  actions.add(new IdGeneratorItemAction());
  doStuff(actions, new Item());
}

しかし、そうでなければ、どこかでキャストなしであなたが望むものを達成することはできないと思います.

于 2012-11-14T15:43:57.993 に答える