当前位置: 首页 > 面试题库 >

创建循环通用引用

艾浩广
2023-03-14
问题内容

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

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. 给定正确的通用定义后,如何正确定义客户端和服务器的非通用实例?

问题答案:

循环通用引用确实是可能的。Java泛型和集合包括几个示例。对于您的情况,这样的标本应如下所示:

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


 类似资料:
  • 问题内容: 如何从while循环中创建sql server cte 这样的循环 问题答案: 如果需要表: 如果您需要一个字符串:

  • 我有以下代码: 这里的主要循环是: 但是我不确定这是最好的方法(如果我想输入什么,这是行不通的) 然后我试了这个: 但正如我所意识到的,这并不像我预期的那么快。所以问题是:创建主循环的最佳方法是什么?

  • 问题内容: 我正在尝试显示10位玩家的表格。我通过ajax获取数据,并将其作为道具传递给我的孩子。 现在,我需要一个列表组件来渲染播放器: 这给了我一个。 我不确定发生了什么,我的控制台日志显示了正确的数据,但是以某种方式我无法在返回中访问它。 我想念什么? 问题答案: 在组件中,您需要更改初始状态,因为您正在尝试使用for,但是此属性是导致错误的原因。 此外,如在是你应该从它那里得到的属性

  • 问题内容: 我有以下代码: 这里的主要循环是: 但是我不确定这是做到这一点的最佳方法(如果我想输入一些信息,这将不起作用) 然后我尝试了这个: 但是,正如我已经意识到的那样,它并没有达到我的预期。所以问题是:创建主循环的最佳方法是什么? 问题答案: Tkinter为此提供了一个强大的工具,它被称为after。它旨在用作同步睡眠命令,但可以通过调用自身在mainloop内建立一个循环。 之后,是一个

  • 问题内容: 在正在进行的项目中,人们编写了服务类来访问DAO。几乎每个业务对象都具有使用自己的DAO的自己的服务。在某些服务上,我们使用对其他服务的引用。目前,人们正在实例化构造函数内部所需的服务。 但是现在,我遇到了麻烦,因为服务A需要服务B而服务B需要服务A,因此对任一构造函数的调用都会导致堆栈溢出… 示例(伪代码): 您将如何解决?使用单例模式? 谢谢 问题答案: Spring框架通过使用依

  • 问题内容: 我正在尝试使用for循环和嵌套for循环制作圣诞树。为了做到这一点,我需要能够用*做一个金字塔。我已经尝试了无数次,但在制作时遇到了问题。这是我的代码: 我想做的是: 问题答案: 试试这个简单得多的代码: 它使用3个循环: 第一个表示行数, 第二个用于打印空间, 第三个用于打印星号。