0

コードでICEを使用しています。そして、パラメーターとして GameObserverPrx を必要とする関数を実行したいと思います。値で GameObserver を渡したくありません。スライス インターフェイスで GameObserver* を使用してプロキシを渡します。

GameObserver を GameObserverPrx にキャストするには、どの関数を使用すればよいですか? 2 番目の質問 - なぜ ICE が私の代わりにそれを行うことができなかったのですか? 私はインターネットで答えを探していました。ObjectAdapter.checkedCast しか見つかりませんでしたが、別の目的に役立ちます。

エラーは次のとおりです。

タイプ GameProxyImpl のメソッド addObserver(String, GameObserverPrx, Current) は引数 (String, GameObserverImpl, null) には適用されません PrzeciwnikKomputerowy.java /warcaby-serwer/src/main/java/sr/warcaby/serwer 74 行目 Java 問題

これが私のコードの一部です: この行にエラーが表示されます。

partia.addObserver(token, new GameObserverImpl(this)), null);

GameObserver 実装のフラグメント:

class GameObserverImpl extends _GameObserverDisp { //extends IGameObserverPOA{

    private static final long serialVersionUID = 1L;
    PrzeciwnikKomputerowy p;
    public GameObserverImpl(PrzeciwnikKomputerowy p) {
        this.p = p;
    }

api.ice のフラグメント:

interface GameObserver {
    void notifyObserver(  CORBAMove lastMove);
};



interface GameProxy {
    void addObserver(  string token,   GameObserver* o) throws MyException;
    bool isMyTurn(  string token) throws MyException;
    void doMove(  string token,   CORBAMove move) throws MyException;
    Position getPosition(  string token) throws MyException;
    string showPosition(  string token) throws MyException;
};

CORBAMove という名前について混乱しないでください。CORBA を使用していましたが、コードを ICE に変更しました。

4

1 に答える 1

0

私は私の質問に対する答えを見つけました。これで、アプリケーションは意図したとおりに動作します。

Ice.Object から ObjectPrx を作成するメソッドを書きました。このメソッドは、リフレクションを使用して、指定されたクラスのキャスト メソッドを見つけます。

このサイトで、必要な関数を見つけました: https://doc.zeroc.com/display/Ice/Object+Incarnation+in+Java#ObjectIncarnationinJava-proxies

最も重要な行は、ObjectPrx objectPrx = adapter.addWithUUID(iceObject) です。

そして、リフレクションから取得したメソッド xxxPrxHelper.checkedCast(objectPrx) を使用してキャストします。変更されたコードは次のとおりです。

partia.addObserver(token, (GameObserverPrx)
    serwer.createProxyForObject(observer, GameObserverPrxHelper.class), null)

クラス ServerImpl のメソッド:

public ObjectPrx createProxyForObject(Ice.Object iceObject, Class<?> clazz) {
    ObjectPrx objectPrx = adapter.addWithUUID(iceObject);
    try {
        Method method = clazz.getMethod("checkedCast", ObjectPrx.class);
        objectPrx =  (ObjectPrx) method.invoke(null, objectPrx);//adapter.createIndirectProxy(id));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return objectPrx;

メソッド createProxyForObject は、サーバー コンストラクターで初期化された通常のアダプターを使用しています (PrzeciwnikKomputerowy クラスはサーバー プログラムの一部であるため)。

    Ice.Communicator communicator = Ice.Util.initialize(args); 

    ObjectAdapter adapter = communicator.createObjectAdapter("ChessServer");
于 2015-05-07T18:49:54.517 に答える