3

ここでは、オブジェクトを使用して、他のオブジェクトとやり取りするときに状態を維持するフレームワークを用意しました。状態と対話するオブジェクト (「アクション」) が、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());
}

ジェネリックの目的で、インターフェイスは親クラスとしてカウントされますか? リフレクションを必要としないこれを実装する方法はありますか?

4

1 に答える 1

0
import java.util.ArrayList;

class State{}

class Framework<State> 
{
    public ArrayList< Action< ? super State > >actions = new ArrayList< Action< ?super State > >();

    void add(Action<? super State> a) {

        actions.add(a);

    } 

    void doRun(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> {
    public void perform( IState1 s )
    {
        System.out.println("Do something 1");
    }
}

class Action2 implements Action<IState2> {

    public void perform( IState2 s )
    {
        System.out.println("Do something 2");
    }   
}

class CombinedState implements IState1, IState2 {}

class Untitled {
    public static void main(String[] args) 
    {
         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.doRun(new CombinedState());
    }
}

これは、OSX 上の CodeRunner で実行されます。

于 2012-08-27T21:39:35.100 に答える