1

によってエクスポートできるようにMessageReceiver拡張されているというインターフェースがあります。定義されているメソッドは 1 つだけです。java.rmi.RemoteUnicastRemoteObject.exportObject(obj)public boolean receive(Message msg) throws RemoteException;

次に、MessageProviderという名前の単一のパブリック メソッドを持つ というインターフェイスがありますtake()InterruptedExceptionこのメソッドは(ブロックすることを意図しているため) をスローします。

必要な機能 (バッファー) を実装するためにQueueMessageBuffer、メッセージをエンキューするためのある種のキューを持つクラスがあります。明らかに、このバッファは"IS A" MessageReceiver "IS A" MessageProviderです。

これが私の最初のステップでした:

public class QueueMessageBuffer implements MessageReceiver, MessageProvider
{
  // ...
  public boolean receive(Message m) throws RemoteException
  {
    // ...
  }
  public Message take() throws InterruptedException
  {
    // ...
  }
}

このクラス定義を使用すると、以下が正常に機能します。

UnicastRemoteObject.exportObject(new QueueMessageBuffer(), 0);

しかし、 と の両方として 1 つのインスタンスを使用する別のクラスがあるため、これら2 つのインターフェイスを結合しようとしました。したがって、私は作成しましたMessageReceiverMessageProvider

public interface MessageBuffer extends MessageReceiver, MessageProvider {}

QueueMessageBufferさらに実装するだけでMessageBuffer

これは私には正しいように見えましたが、今exportObjectは例外を与えています:

java.rmi.server.ExportException: リモート オブジェクトが不正なリモート インターフェイスを実装しています。ネストされた例外: java.lang.IllegalArgumentException: 不正なリモート メソッドが検出されました: public abstract oertwig.rmichat.net.NetworkMessage oertwig.rmichat.net.MessageProvider.take() は、sun.rmi.server.UnicastServerRef で java.lang.InterruptedException をスローします。 java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:310) の exportObject(UnicastServerRef.java:198) java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:252) の

質問は簡単です:なぜですか?賢明な階層を維持しながらそれを解決するにはどうすればよいですか?

4

1 に答える 1

2

メソッド take() は、RemoteExceptionをスローできると宣言されていません。この宣言は必須であるため、宣言のないメソッドを持つインターフェイスは不正です。RemoteException は、リモート メソッド呼び出しの実行中に発生する可能性があるさまざまな通信の問題でスローされます。

于 2013-01-14T07:48:17.550 に答える