によってエクスポートできるようにMessageReceiver
拡張されているというインターフェースがあります。定義されているメソッドは 1 つだけです。java.rmi.Remote
UnicastRemoteObject.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 つのインターフェイスを結合しようとしました。したがって、私は作成しましたMessageReceiver
MessageProvider
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) の
質問は簡単です:なぜですか?賢明な階層を維持しながらそれを解決するにはどうすればよいですか?