まず、このコードの背後にある考え方を説明しようと思います。特定のタイプの他のクラス(Processables)を処理できるクラス(Processors)がたくさんあります。特定の順序で実行するプロセッサのリストがあります。特定のプロセッサの処理するデータ(Processables)を取得するマップがあります。なんとなくこんな感じ。
public abstract class AbstractProcessable {
...
}
public class DummyProcessable extends AbstractProcessable {
...
}
public abstract class AbstractProcessor<T extends AbstractProcessable> {
public abstract void process(List<T> listOfProcessables);
}
public class DummyProcessor extends AbstractProcessor<DummyProcessable> {
@Override
public void process(List<DummyProcessable> listToProcess) {
...
}
}
これは今のところうまくいくようです。コンパイルエラーはありません。しかし今、私は次のようなクラスを持っています:
public class RandomClass {
private List<AbstractProcessor<? extends AbstractProcessable>> processors;
private Map<Class<? extends AbstractProcessor>, List<? extends AbstractProcessable>> data;
public RandomClass() {
processors = new ArrayList<>();
processors.add(new DummyProcessor());
data = new HashMap<>();
data.put(DummyProcessor.class, new ArrayList<DummyProcessable>());
processAll();
}
private void processAll() {
for (AbstractProcessor<? extends AbstractProcessable> processor : processors) {
List<? extends AbstractProcessable> dataToProcess;
dataToProcess = data.get(processor);
processor.process(dataToProcess); // compile error
}
}
}
コンパイルエラー:
The method process(List<capture#4-of ? extends AbstractProcessable>) in the type AbstractProcessor<capture#4-of ? extends AbstractProcessable> is not applicable for the arguments (List<capture#5-of ? extends AbstractProcessable>)
少し読みづらいかもしれませんが、なるべく簡略化してみました。私もジェネリックが苦手なので、ワイルドカードを間違って使用したのではないでしょうか。誰かが私がその問題を解決するのを手伝ってくれる?
よろしくお願いします!