有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建循环泛型引用

我正在编写一个应用程序,在对等网络中进行一些分布式计算。在定义网络时,我有两个类P2P网络和P2P客户端。我希望这些是通用的,因此有以下定义:

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

P2PClient<T extends P2PNetwork<? extends T>>

使用P2P客户端定义setNetwork(T网络)方法。我希望用这段代码描述的是:

  1. P2P网络由以下部分组成: 某种类型的客户
  2. P2P客户端只能属于 其客户端由 与此客户端相同的类型( 循环引用)

这对我来说似乎是正确的,但如果我尝试创建一个非通用版本,例如

MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;

和其他变体,我收到了来自编译器的大量错误。因此,我的问题如下:

  1. 通用循环引用是否为偶数 可能(我从未见过任何明确禁止它的东西)
  2. 上述通用定义是否为 这种循环的正确定义 关系
  3. 如果有效,是否为“正确” 描述这种关系的方式 (即是否有其他有效的 定义,从风格上来说 首选)
  4. 我如何正确定义 客户端的非泛型实例和 服务器提供了适当的泛型 定义

共 (2) 个答案

  1. # 1 楼答案

    如果您进一步定义了“特定类型”的含义,即P2P网络的各种“类型”之间的差异,那么这可能有助于我们回答您的问题

    但是,与其相互表示依赖关系/循环关系,不如通过引入第三类P2PType来表示:

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

    我可能忽略了一些东西,但我认为这将允许编译器强制执行P2P客户端是相同泛型类型的P2P网络的一部分

    但是,如果“类型”本身不适合表示为面向对象的对象,即P2PType不是具有方法、多态行为等的对象,那么这种方法可能会崩溃

  2. # 2 楼答案

    循环泛型引用确实是可能的Java Generics and Collections包括几个例子。对于您的情况,这样的样本如下所示:

    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);