ピアツーピアネットワークで分散計算を行うためのアプリケーションを作成しています。ネットワークを定義する際に、P2PNetworkとP2PClientの2つのクラスがあります。これらを一般的なものにしたいので、次の定義があります。
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
P2PClientがsetNetwork(T network)のメソッドを定義します。このコードで説明したいのは次のとおりです。
- P2PNetworkは、特定のタイプのクライアントで構成されています
- P2PClientは、クライアントがこのクライアントと同じタイプで構成されているネットワークにのみ属することができます(循環参照)
これは私には正しいようですが、次のような一般的でないバージョンを作成しようとすると
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
およびその他のバリアントコンパイラから多数のエラーを受け取ります。だから私の質問は次のとおりです:
- 一般的な循環参照も可能ですか(明示的に禁止されているものを見たことがありません)?
- 上記の一般的な定義は、そのような循環関係の正しい定義ですか?
- それが有効である場合、それはそのような関係を説明するための「正しい」方法ですか(つまり、スタイル的に好ましい別の有効な定義がありますか)?
- 適切なジェネリック定義が与えられた場合、クライアントとサーバーの非ジェネリックインスタンスを適切に定義するにはどうすればよいですか?