ここでは、オブジェクトを使用して、他のオブジェクトとやり取りするときに状態を維持するフレームワークを用意しました。状態と対話するオブジェクト (「アクション」) が、State オブジェクトが実装するインターフェイスのタイプを一般的に受け入れることができることを望んでいましたが、これを機能させるのに問題があります。
特定の状態の実装 (またはインターフェイス) に関してフレームワーク オブジェクト自体を定義し、定義された状態を直接または状態が実装するインターフェイスを介して受け入れる限り、それにアクションを追加できるようにしたいと考えています。
私が理解しているように、<? super S>
定義は「S の親である型」を意味しますが、S によって実装されるインターフェイスがこの説明に適合するかどうかはわかりません。厳密には親クラスではないためです。
以下に例を示します (コードを正確にコンパイルするわけではありません)。
Class Framework<State> {
addAction(Action<? super State> a) {} // adds to a list of actions to be run
run(State s) {
for(Action<? super State> a : actions) {
a.perform(s);
}
}
}
Interface IState1 {}
Interface IState2 {}
Interface Action<State> {
public void perform(State s);
}
Class Action1 implements Action<IState1> {}
Class Action2 implements Action<IState2> {}
Class CombinedState implements IState1, IState2 {}
public static void run() {
Framework<CombinedState> f = new Framework<CombinedState>();
// add is expecting Action<? super CombinedState> but getting Action<IState1>
f.add(new Action1()); // This doesn't seem to work
f.add(new Action2());
f.run(new CombinedState());
}
ジェネリックの目的で、インターフェイスは親クラスとしてカウントされますか? リフレクションを必要としないこれを実装する方法はありますか?