21

ピアツーピアネットワークで分散計算を行うためのアプリケーションを作成しています。ネットワークを定義する際に、P2PNetworkとP2PClientの2つのクラスがあります。これらを一般的なものにしたいので、次の定義があります。

P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>

P2PClient<T extends P2PNetwork<? extends T>>

P2PClientがsetNetwork(T network)のメソッドを定義します。このコードで説明したいのは次のとおりです。

  1. P2PNetworkは、特定のタイプのクライアントで構成されています
  2. P2PClientは、クライアントがこのクライアントと同じタイプで構成されているネットワークにのみ属することができます(循環参照)

これは私には正しいようですが、次のような一般的でないバージョンを作成しようとすると

MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;

およびその他のバリアントコンパイラから多数のエラーを受け取ります。だから私の質問は次のとおりです:

  1. 一般的な循環参照も可能ですか(明示的に禁止されているものを見たことがありません)?
  2. 上記の一般的な定義は、そのような循環関係の正しい定義ですか?
  3. それが有効である場合、それはそのような関係を説明するための「正しい」方法ですか(つまり、スタイル的に好ましい別の有効な定義がありますか)?
  4. 適切なジェネリック定義が与えられた場合、クライアントとサーバーの非ジェネリックインスタンスを適切に定義するにはどうすればよいですか?
4

2 に答える 2

29

循環的な一般的な参照は確かに可能です。Java GenericsandCollectionsにはいくつかの例が含まれています。あなたの場合、そのような標本は次のようになります。

public interface P2PNetwork<N extends P2PNetwork<N, C>,
                            C extends P2PClient<N, C>> {
  void addClient(C client);
}

public interface P2PClient<N extends P2PNetwork<N, C>,
                            C extends P2PClient<N, C>> {
  void setNetwork(N network);
}

class TorrentNetwork implements P2PNetwork<TorrentNetwork, TorrentClient> {
  @Override
  public void addClient(TorrentClient client) {
    ...
  }
}

class TorrentClient implements P2PClient<TorrentNetwork, TorrentClient> {
  @Override
  public void setNetwork(TorrentNetwork network) {
    ...
  }
}

...

TorrentNetwork network = new TorrentNetwork();
TorrentClient client = new TorrentClient();

network.addClient(client);
于 2010-04-16T20:48:12.900 に答える
3

「特定のタイプ」が何を意味するのか、つまり、P2PNetworksのさまざまな「タイプ」の違いが何であるかをさらに定義すると、回答に役立つ場合があります。

しかし、依存関係/循環関係を相互に表現する代わりに、3番目のクラスであるP2PType:を導入することで表現する方が簡単な場合があります。

public class P2PNetwork<T extends P2PType> {
    ...
}
public class P2PClient<T extends P2PType> {
    ...
    public void setNetwork(P2PNetwork<T> network) { ... }
}

私は何かを見落としているかもしれませんが、これによりコンパイラはP2PClientsが同じ汎用タイプのP2PNetworksの一部であることを強制できるようになると思います。

P2PTypeただし、「タイプ」がオブジェクト指向自体として表現するのに適したものでない場合、つまり、メソッドやポリモーフィックな動作などを備えたものでない場合、このアプローチは崩壊する可能性があります。

于 2010-04-02T16:00:03.297 に答える